我遇到了一个服务绑定问题,这让我疯了。
我有一个绑定服务的活动,并且用户经常进出该活动。
当用户第一次参加活动时,问题就出现了,这个活动解除了服务,再次进入,不再绑定。
活动以这种方式调用绑定服务:
@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
我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);
}
所以我的问题是,当活动再次进入时,我如何再次绑定服务?或者我应该怎么做才能保持绑定活着直到用户进入活动?
答案 0 :(得分:3)
我找到了解决方案!
我的意思是如何再次致电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;
}
有关详细说明,请点击:Bound Services
答案 1 :(得分:0)
从Activity中绑定到您的服务时使用getApplicationContext
()API,如下所示:
getApplicationContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
getApplicationContext
返回全局应用程序上下文 - 与其他上下文的区别在于,例如,当您的活动结束时,Android可能会销毁(或以其他方式使其不可用)活动上下文。应用程序上下文在您的Application对象存在时仍然可用(与特定活动无关)