【问题标题】:Application terminates before onStop() is finished应用程序在 onStop() 完成之前终止
【发布时间】: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,在后台工作,可以在应用被终止时保存文件
  • 在这种情况下,工作经理或前台服务都会有所帮助

标签: android android-intent android-activity android-service android-lifecycle


【解决方案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 是不可杀死的,除非发生崩溃等情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 2017-08-31
  • 2011-04-19
  • 1970-01-01
  • 2016-01-12
  • 2019-12-12
相关资源
最近更新 更多