【问题标题】:SharedPreferences not saved in onDestroy of ServiceSharedPreferences 未保存在服务的 onDestroy 中
【发布时间】:2015-12-11 03:31:25
【问题描述】:

在活动被终止之前(当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 方法可以覆盖那里......

【问题讨论】:

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


【解决方案1】:

根据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() 来阻止并销毁它。

完成Service的示例

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

有关IntentService 的更多信息,请访问this tutorial。 有关Service 生命周期的更多信息,请访问this link

【讨论】:

  • 这是一个非常好的建议,但不幸的是对我不起作用。在我的情况下没有onPause(),因为这不是Activity。我犯了一个错误。这是Service,对于Service,只有onCreateonStartonDestroy 方法...developer.android.com/reference/android/app/Service.html
  • 那么,看看编辑。它可能会有所帮助。 @th3pat3l
【解决方案2】:

Service 中的onDestroy 可以通过显式调用stopService() 方法来访问。

虽然您想清除服务中的共享首选项,但这确实不可靠。我敢肯定会有一个ActivityService 开头。

我会在 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,你需要考虑应用生命周期的多个场景。通常很难想到情况,但我相信您将能够弄清楚。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2011-12-27
    • 2011-11-06
    • 2017-02-12
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多