当应用程序转到后台时,使用公共基本活动停止服务

时间:2013-04-25 15:59:25

标签: android android-activity android-service

我有一个Base Activity类来实现所有活动的常见行为。所有这些都扩展了这个BaseActivity。

我在BaseActivity的onStart方法中绑定了一个服务,并在onStop方法中绑定了有条件地。有条件地,我的意思是,根据用户选择的某个选项,当应用程序转到后台时,服务应该或不应该在后台运行。

问题在于,有时服务会在不应该运行的情况下继续运行(这时,启用了杀死它的选项,并且有效地调用了unbindService())。

我认为在每次活动更改时,服务都会被绑定并再次绑定。由于绑定服务是引用计数的,因此我的服务绑定的次数可能比未绑定的多,所以即使我调用unbindService(),它也会在最后保持运行。

此外,documentation说明了一些事情:

  

在匹配客户生命周期的启动和拆卸时刻时,通常应该将绑定和解除绑定配对。例如:

     

如果您只需要在活动可见时与服务进行交互,则应在onStart()期间绑定并在onStop()期间取消绑定。

     

如果您希望活动即使在后台停止时也会收到响应,那么您可以在onCreate()期间绑定并在onDestroy()期间取消绑定。请注意,这意味着您的活动需要在整个运行时使用服务(即使在后台),因此如果服务在另一个进程中,那么您会增加进程的权重,系统将更有可能杀了它。

由于我试图实现这两个选项,实现这个选项的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

最后,我改变了方法并决定仅使用startService()并使用本地广播接收器与服务进行通信。

我在onCreate()中启动该服务,并在基本活动的onDestroy()方法中停止该服务。 然后,为了从服务向活动发送消息,我使用:

private void sendBroadcastMessage(String msg) {
    Log.d(LOG_TAG, "send broadcast message: " + msg);
    Intent intent = new Intent(MyService.class.getSimpleName());
    // Add data
    intent.putExtra("message", msg);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

然后,在活动中收到通知:

// handler for the events launched by the service
private BroadcastReceiver mMyServiceReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Extract data included in the Intent
        String message = intent.getStringExtra("message");
        Log.d(LOG_TAG, "Got message: " + message);
        // Do stuff...
    }
};

并在活动中注册接收者:

@Override
public void onResume() {
    super.onResume();

    LocalBroadcastManager.getInstance(this).registerReceiver(mMonitorReceiver,
          new IntentFilter(MyService.class.getSimpleName()));
}