我遇到了一个服务绑定的问题,它让我抓狂。
我有一个绑定服务的活动,并且用户经常进出该活动。
问题出现在用户第一次离开活动时,这个活动解除绑定服务,当再次进入时,不再绑定服务。
活动以这种方式调用绑定服务:
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, CService.class);
intent.putExtra("id_local", (String) getIntent().getExtras().get("id_local"));
intent.putExtra("id_send", (String) getIntent().getExtras().get("id_send"));
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
registerReceiver(uiUpdated, new IntentFilter("SERVER_MESAGE"));
mBound = true;
}
其中mConnection
是这样定义的:
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
CService.LocalBinder binder =(CService.LocalBinder) service;
mService = binder.getService();
Log.d("Service", "onServiceConnected");
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
Log.d("Service", "onServiceDisconnected");
mBound = false;
}
};
在onStop
I unbindService
中:
@Override
protected void onStop() {
if (mBound) {
Log.d("ActivityStop", "Stoping activity");
unregisterReceiver(uiUpdated);
unbindService(mConnection);
mBound = false;
}
super.onStop();
}
业务中的onBind
为:
@Override
public IBinder onBind(Intent intent) {
final String id_local = intent.getStringExtra("id_local");
final String id_send = intent.getStringExtra("id_send");
if (!misatgesList.isEmpty()) {
misatgesList.clear();
}
mBackGroundTimer.schedule(new TimerTask() {
@Override
public void run() {
String serverResult = restRecive(id_local, id_send,
misatgesList.size());
if (serverResult != null) {
misatgesList.addAll(procesMisatges(serverResult,
id_local));
Intent i = new Intent("SERVER_MESAGE");
i.putExtra("recive", serverResult);
sendBroadcast(i);
}
}
}, 0, 1000);
return mBinder;
}
onUnBind
就是那个
@Override
public boolean onUnbind(Intent intent) {
mBackGroundTimer.cancel();
misatgesList.clear();
Log.d("ServiceOnUnBind", "ServiceOnUnBind");
//stopSelf();
return super.onUnbind(intent);
}
所以我的问题是,当活动再次进入时,我如何再次绑定服务?或者我应该做些什么来保持绑定活动,直到用户进入活动? 我找到解决方案了!
我的意思是如何再次调用onBind
。这是使用onRebind
完成的,这允许您再次调用onBind
。
onRebind
:
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
}
此外,为了使onRebind工作,您必须将onUnbind
中的返回值转换为true
。
@Override
public boolean onUnbind(Intent intent) {
mBackGroundTimer.cancel();
misatgesList.clear();
Log.d("ServiceOnUnBind", "ServiceOnUnBind");
//return super.onUnbind(intent);
return true;
}
有关更多说明,请查看:绑定服务
使用getApplicationContext
() API从Activity绑定到你的服务,如下所示:
getApplicationContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
getApplicationContext
返回全局应用程序上下文-与其他上下文的不同之处在于,例如,当您的活动结束时,活动上下文可能会被Android销毁(或以其他方式不可用)。当应用程序对象存在时,应用程序上下文始终可用(它不绑定到特定的活动)