应用程序在 onStop() 完成之前终止

Application terminates before onStop() is finished

我的应用程序中有一个逻辑,因此当发生 OnStop() 时,我将文件保存到存储器中。但是,如果文件很大并且我通过从“最近”选项卡滑动来关闭应用程序,我的应用程序会在我的文件保存之前关闭。所以它打开文件然后应用程序死掉并且文件保持为空。 这是正常行为还是我 phone 上的任务杀手玩得太过火了?我一定要创建一个保存文件的服务吗?

示例代码:

@Override
public void onStop() {
  try (FileWriter writer = new FileWriter(path)) {
    if (veryLargeFile == null) { 
      return;
    }
    String s = veryLargeFile.toString();
    Log.d(TAG, "this message is shown");
    writer.write(s);
    Log.d(TAG, "this message is not shown");
    writer.flush();
  } catch (IOException ex) {}
  super.onStop();
}

示例 2:

@Override
public void onPause() {
  try (FileWriter writer = new FileWriter(path)) {
    if (veryLargeFile == null) { 
      return;
    }
    String s = veryLargeFile.toString();
    Log.d(TAG, "this message is shown");
    writer.write(s);
    Log.d(TAG, "this message is not shown");
    writer.flush();
  } catch (Exception ex) {    
    Log.d(TAG, "this message is not shown");
  }
  super.onPause();
}

这是有道理的,我假设文件保存将异步发生,因此您无法保证它会在应用程序完全拆除之前完成。

正如评论中的某些人已经指出的那样,WorkManager 可能是您最好的解决方案,它能够推迟系统管理的异步任务,因此能够 运行即使您的应用已完成。

这里有一些不错的文档:Schedule tasks with WorkManager


编辑

如果您尝试 运行 的代码是同步的,它应该仍然能够在 onStop(post Honeycomb)或 onPause 期间完成,因为生命周期方法(正如 documentation 所描述的那样)是“无法杀死的”。

然而,如果您的应用程序在完成时被强制停止或崩溃,并且如生命周期文档所述:

Keep in mind that under extreme memory pressure the system can kill the application process at any time.

所以我认为这是您特定设备上的内存管理问题,导致应用程序过早终止。如果是这种情况,那么我会考虑使用更好的持久化方法,如果有必要,可以定期或在您的应用程序前台时间使用。