SharedPreferences未保存在onDestroy of Service中

ᴛʜᴇ*_*ᴛᴇʟ 3 android android-service android-studio android-sharedpreferences android-ondestroy

在活动被杀之前(OnDestroy被叫时),我保存了一些intSharedPreferences.

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

Wait它可以在被杀之前做些什么吗?

这是我的例子:

@Override
public void onDestroy(){

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

    super.onDestroy();
    removeView();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mau*_*ker 7

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

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

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

在某些情况下,系统会简单地杀死活动的托管进程,而不会在其中调用此方法(或任何其他方法),因此它不应该用于执行在进程消失后保留的内容.

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


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

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

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

完成一个例子Service:

@Override
protected void onPause() {
    super.onPause();
    stopService(new Intent(context, YourService.class));
}
Run Code Online (Sandbox Code Playgroud)

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