SharedPreferences未保存在onDestroy of Service中

时间:2015-09-15 01:59:07

标签: android android-studio android-service android-sharedpreferences android-ondestroy

在活动被杀之前(调用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,但事实并非如此。我正在调用ServiceonDestroy,遗憾的是,没有onPause方法可以覆盖那里......

2 个答案:

答案 0 :(得分:7)

根据the docs,不要依赖onDestroy()方法来保留您的数据。请改用onPause()

  

注意:不要指望此方法被称为保存地点   数据!

     

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

     

在某些情况下,系统会简单地杀死活动的托管   进程中没有调用此方法(或任何其他方法),所以它   不应该被用来做那些打算留下来的东西   过程消失后。

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

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

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

  1. 如果您想在用户关闭应用时使用SharedPreferences,请将该方法移至Activity或;
  2. Activity#onPause()内,您可以使用stopService()方法销毁Service。 (见下面的例子)。
  3. 如果你的Service应该做一些工作,如果完成这项工作后它应该修改SharedPreferences,你可以尝试使用IntentService,因为一旦这种服务完成它的工作,它会自我毁灭。但请注意,一次只能运行一个IntentService!它在FIFO队列上运行。
  4. 如果您不想使用IntentService,还可以从常规Service内拨打stopSelf()以停止并销毁它。
  5. 完成Service 的示例:

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

    有关this tutorial IntentService的更多信息。 有关this linkService生命周期的更多信息。

答案 1 :(得分:2)

通过明确调用onDestroy方法,可以在Service中找到{p> 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();
}

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