3

在活动被杀死(何时OnDestroy被调用)之前,我将一些int值保存在SharedPreferences.

但我注意到的是,保存值大约需要一秒钟,但应用程序在销毁Activity.

我可以Wait在它被杀死之前做一些事情吗?

这是我的例子:

@Override
public void onDestroy(){

    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt("finalXPos", finalX);
    editor.putInt("finalYPos", finalY);
    editor.commit();

    super.onDestroy();
    removeView();
}

======================>> 编辑 <<======================

我犯了一个错误,说这是为了一个,Activity但事实并非如此。我正在调用服务onDestroy,不幸的是没有方法可以覆盖那里......onPause

4

2 回答 2

10

根据文档,不要依赖该onDestroy()方法来保存您的数据。改为使用onPause()

注意:不要指望这个方法被称为保存数据的地方!

例如,如果一个活动在内容提供者中编辑数据,这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle) 中提交,而不是在此处提交。此方法通常用于释放资源,例如与活动相关联的线程,以便被破坏的活动不会在其应用程序的其余部分仍在运行时留下这些东西。

在某些情况下,系统会简单地终止 Activity 的宿主进程,而不会在其中调用此方法(或任何其他方法),因此不应使用它来执行打算在进程消失后保留的事情。

此外,您可以尝试使用该方法apply()而不是commit()您的方法,SharedPreferences.Editor因为它可以更快、异步地保存您的数据,并且根本没有要处理的返回值。


编辑:好的,所以你使用的是Service. 问题是,它们的寿命可能Activity远远超过生命,因为它们一直在后台运行。因此onDestroy(),即使您使用后退按钮关闭应用程序,您的服务也可能需要很长时间才能被调用。

我不确定您的应用程序应该如何工作,但我可以提出一些建议。

  1. 如果您想SharedPreferences在用户关闭应用程序时处理您的问题,请将该方法移至Activityor;
  2. 在里面你可以使用该方法Activity#onPause()销毁。(见下面的例子)。ServicestopService()
  3. 如果您Service应该做一些工作,并且在完成此工作后应该修改SharedPreferences,您可以尝试使用IntentService,因为一旦这种服务完成其工作,它就会自我毁灭。但请注意,一次IntentService只能运行一个!它在 FIFO 队列上运行。
  4. 如果您不想使用IntentService,您也可以stopSelf()从您的常规中调用Service以停止并销毁它。

完成 a 的示例Service

@Override
protected void onPause() {
    super.onPause();
    stopService(new Intent(context, YourService.class));
}

IntentService有关本教程的更多信息。有关此链接Service上的生命周期的更多信息。

于 2015-09-15T02:51:36.200 回答
2

onDestroyinService可以通过显式调用stopService()方法到达。

尽管您想清除服务中的共享首选项,但这确实不可靠。我敢肯定会有一个Activity启动Service.

我会在那做一个方法Activity,就像这样。

 private void stopService() {
    stopService(new Intent(getApplicationContext(), MyService.class));
 }

并且每当您想真正杀死该应用程序时,您都可以stopService(..)像调用一样调用..

private void stopService() {
    clearPref();
    stopService(new Intent(getApplicationContext(), MyService.class));
}

private void clearPref() {
    // Clearing all data from Shared Preferences
    editor.clear();  // where editor is an Editor for Shared Preferences
    editor.commit();
}

对于Service,需要考虑应用生命周期的多个场景。通常很难想到情况,但我相信您将能够弄清楚。祝你好运!

于 2015-09-15T05:11:08.760 回答