Android - 我的服务 onunbind 但没有再次绑定
Android - My service onunbind but no bind again
我遇到了一个服务绑定问题,这让我很抓狂。
我有一个绑定服务的activity,用户经常进出那个activity。
问题出在用户第一次出门的时候activity这个解开绑定服务,再进去的时候就不再绑定了。
activity 以这种方式调用绑定服务:
@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);
}
所以我的问题是,当 activity 再次进入时,如何重新绑定服务?或者在用户进入 activity?
之前,我应该怎么做才能使绑定保持活动状态
从 Activity 绑定到您的服务时使用 getApplicationContext
() API,如下所示:
getApplicationContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
getApplicationContext
returns 全局应用程序上下文 - 与其他上下文的不同之处在于,例如,activity 上下文可能会被 [=17 破坏(或以其他方式变得不可用) =] 当你的 activity 结束时。当您的应用程序对象存在时,应用程序上下文始终可用(不依赖于特定的 Activity)
我找到了解决方案!
我的意思是如何再次调用onBind
。这是使用 onRebind
完成的,它允许您再次调用 onBind
。
所以,我创建了 onRebind
:
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
}
此外,要使 onRebind 起作用,您必须将 onUnbind
中的 return 更改为 true
。
@Override
public boolean onUnbind(Intent intent) {
mBackGroundTimer.cancel();
misatgesList.clear();
Log.d("ServiceOnUnBind", "ServiceOnUnBind");
//return super.onUnbind(intent);
return true;
}
有关更多说明,请查看:Bound Services
我遇到了一个服务绑定问题,这让我很抓狂。
我有一个绑定服务的activity,用户经常进出那个activity。
问题出在用户第一次出门的时候activity这个解开绑定服务,再进去的时候就不再绑定了。
activity 以这种方式调用绑定服务:
@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);
}
所以我的问题是,当 activity 再次进入时,如何重新绑定服务?或者在用户进入 activity?
之前,我应该怎么做才能使绑定保持活动状态从 Activity 绑定到您的服务时使用 getApplicationContext
() API,如下所示:
getApplicationContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
getApplicationContext
returns 全局应用程序上下文 - 与其他上下文的不同之处在于,例如,activity 上下文可能会被 [=17 破坏(或以其他方式变得不可用) =] 当你的 activity 结束时。当您的应用程序对象存在时,应用程序上下文始终可用(不依赖于特定的 Activity)
我找到了解决方案!
我的意思是如何再次调用onBind
。这是使用 onRebind
完成的,它允许您再次调用 onBind
。
所以,我创建了 onRebind
:
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
}
此外,要使 onRebind 起作用,您必须将 onUnbind
中的 return 更改为 true
。
@Override
public boolean onUnbind(Intent intent) {
mBackGroundTimer.cancel();
misatgesList.clear();
Log.d("ServiceOnUnBind", "ServiceOnUnBind");
//return super.onUnbind(intent);
return true;
}
有关更多说明,请查看:Bound Services