2

我有一个基本活动类来实现所有活动的共同行为。它们都扩展了这个 BaseActivity。

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

问题是,有时服务会在不应该运行的时候继续运行(也就是说,当启用了终止它的选项,并且有效地调用了 unbindService() 时)。

我在想,在每次 Activity 更改时,服务都未绑定并再次绑定。由于绑定的服务是引用计数的,也许我的服务被绑定的次数比未绑定的次数多,所以这就是为什么它最终会继续运行,即使我调用 unbindService() 也是如此。

此外,文档中对此进行了说明:

您通常应该在客户端生命周期的匹配启动和拆卸时刻配对绑定和取消绑定。例如:

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

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

由于我正在尝试实施这两个选项,因此实施此选项的最佳方法应该是什么?

4

1 回答 1

0

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

我在 Base ActivityonCreate()的方法中启动服务并停止它。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()));
}
于 2013-04-29T07:32:28.563 回答