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



我在应用程序中有一个逻辑,当OnStop()发生时,我将文件保存到存储中。但是,如果文件很大,并且我通过从"最近"选项卡中滑动来关闭应用程序,那么在保存文件之前,应用程序就会关闭。所以它打开文件,然后应用程序死亡,文件仍然是空的。这是正常的行为还是我手机上的任务杀手玩过头了?我应该创建一个服务来保存文件吗?

示例代码:

@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(后蜂巢)或onPause期间完成,因为生命周期方法(如文档所描述的)是"不可杀死的"。

然而,如果你的应用程序在完成时被强制停止或崩溃,这仍然不能保证,正如生命周期文档所述:

请记住,在极端内存压力下,系统可以随时终止应用程序进程。

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

最新更新