我在应用程序中有一个逻辑,当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
期间完成,因为生命周期方法(如文档所描述的)是"不可杀死的"。
然而,如果你的应用程序在完成时被强制停止或崩溃,这仍然不能保证,正如生命周期文档所述:
请记住,在极端内存压力下,系统可以随时终止应用程序进程。
所以我认为这是你的特定设备上的内存管理问题,导致应用程序过早被杀死。如果是这种情况,那么我会考虑使用更好的持久化方法,无论是在定期间隔或在应用程序前台时间,如果它是必要的。