屏幕旋转时避免杀死并重新启动服务

时间:2014-11-16 15:15:17

标签: android multithreading android-service

我正在开发一个使用Services来执行异步操作的Android应用程序。

目前,我一直关注建议的模式,以便在UI关闭时取消绑定服务

onStart(){
    context.bindService();
}

onResume(){
    serviceConnection.registerCallback(this); //register/unregisterCallback is defined in my domain
    checkServiceForPendingUIActionsToRequestUser();
}

onPause(){
    serviceConnection.unregisterCallback(this);
}

onStop(){
    context.unbindService();
}

这种方法的问题有两个:

  • 当我旋转设备以测试不同的布局时,正确执行unbind / bind循环,最终我看到服务将自身重置为原始状态
  • 该服务旨在发布通知,如果UI未显示,以引起用户注意执行操作:当用户点击通知时,UI应该检查服务状态并需要适当的输入(长 - 命名方法),但我可以看到该服务再次重置为其原始状态

注释unbindService()调用以保持服务处于活动状态并不是一个好习惯,但无论如何我必须保持我的服务(在不等待输入的情况下也作为前景运行),至少在屏幕旋转之前完了。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

选项#1:不要使用绑定模式,而是使用命令模式(startService()stopService()stopSelf()一起使用)。

选项#2。绑定保留片段中的Application上下文,在片段本身被销毁时解除绑定。保留的片段存在于配置更改中。 Application上下文避免了与在配置更改中保留绑定相关的一个可能的内存泄漏区域。

This sample project演示了选项#2。在我的DownloadFragment中,我绑定到onAttach()中的服务:

  @Override
  public void onAttach(Activity host) {
    super.onAttach(host);

    appContext=(Application)host.getApplicationContext();
    appContext.bindService(new Intent(getActivity(),
                                      DownloadService.class), this,
                            Context.BIND_AUTO_CREATE);
  }

(片段本身也作为ServiceConnection

我在onDestroy()取消绑定:

  @Override
  public void onDestroy() {
    appContext.unbindService(this);
    disconnect();

    super.onDestroy();
  }