应用程序在 onStop() 完成之前终止
Posted
技术标签:
【中文标题】应用程序在 onStop() 完成之前终止【英文标题】:Application terminates before onStop() is finished 【发布时间】:2021-06-01 23:14:54 【问题描述】:我的应用程序中有一个逻辑,因此当 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();
【问题讨论】:
如果我把我的保存代码放在 onPause() 中同样的行为 是的前台可以解决你的问题 使用 WorkManager,在后台工作,可以在应用被终止时保存文件 在这种情况下,工作经理或前台服务都会有所帮助 【参考方案1】:这是有道理的,我认为文件保存将异步进行,因此您无法保证它会在应用程序完全关闭之前完成。
正如 cmets 中的一些人已经指出的那样,WorkManager
可能是您最好的解决方案,并且能够将异步任务推迟到系统来管理,因此即使您的应用程序完成也能够运行。
这里有一些不错的文档:Schedule tasks with WorkManager。
编辑
如果您尝试运行的代码是同步的,它应该仍然能够在onStop
(蜂窝后)或onPause
期间完成,因为生命周期方法是(正如documentation 所描述的那样)“杀不死”。
但是,这仍然不能保证您的应用在完成时是否被强制停止或崩溃,并且如生命周期文档所述:
请记住,在极端的内存压力下,系统可以随时终止应用程序进程。
所以我认为这是您特定设备上的内存管理问题,导致应用程序过早终止。如果是这种情况,那么我会考虑使用更好的持久化方法,无论是定期间隔还是在必要时在您的应用前台时间。
【讨论】:
你能解释一下为什么我的应用在我的代码中间被拆掉了吗?我有 FileWriter 并且应用程序以 write() 方法终止。我不知道它是否是异步的,但在那之后我有 flush() 没有达到 这很有趣,据我所知,FileWriter
运行在主线程上,让我做更多研究并回复您!
无论我是在onStop()
还是onPause()
中写入文件,问题仍然存在
@gamarjoba, “你能解释一下为什么我的应用程序在我的代码中间被拆除了吗?” 这是系统的行为方式。 Here我回答了一个非常相似的问题。
我不知道我是否认为这是正确的,如果你看这里developer.android.com/reference/android/app/… 是说onStop
是不可杀死的,除非发生崩溃等情况。以上是关于应用程序在 onStop() 完成之前终止的主要内容,如果未能解决你的问题,请参考以下文章