我有一个Base Activity类来实现所有活动的常见行为。所有这些都扩展了这个BaseActivity。
我在BaseActivity的onStart方法中绑定了一个服务,并在onStop方法中绑定了有条件地。有条件地,我的意思是,根据用户选择的某个选项,当应用程序转到后台时,服务应该或不应该在后台运行。
问题在于,有时服务会在不应该运行的情况下继续运行(这时,启用了杀死它的选项,并且有效地调用了unbindService())。
我认为在每次活动更改时,服务都会被绑定并再次绑定。由于绑定服务是引用计数的,因此我的服务绑定的次数可能比未绑定的多,所以即使我调用unbindService(),它也会在最后保持运行。
此外,documentation说明了一些事情:
在匹配客户生命周期的启动和拆卸时刻时,通常应该将绑定和解除绑定配对。例如:
如果您只需要在活动可见时与服务进行交互,则应在onStart()期间绑定并在onStop()期间取消绑定。
如果您希望活动即使在后台停止时也会收到响应,那么您可以在onCreate()期间绑定并在onDestroy()期间取消绑定。请注意,这意味着您的活动需要在整个运行时使用服务(即使在后台),因此如果服务在另一个进程中,那么您会增加进程的权重,系统将更有可能杀了它。
由于我试图实现这两个选项,实现这个选项的最佳方法是什么?
答案 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()));
}