我目前在我的应用中使用2种服务:
1:LocationService,基本上是尝试对用户进行本地化,旨在仅在应用程序处于前台时才保持活动状态.
2:XmppService,用于初始化与xmpp服务器的连接,接收消息,发送消息,注销…并旨在保持活动状态,直到用户注销为止.
我已经阅读了很多文档,但是我不清楚.
尝试存储LocationServiceBinder的引用时遇到泄漏,该引用用于调用我的服务函数(使用AIDL接口). Xmpp也一样.当我解除绑定时,有时会得到ANR(这似乎与我的绑定/解除绑定很奇怪的事实联系在一起,onResume,onRestart …).
所有系统都在工作,但是我敢肯定这不是正确的方法,请我跟随有经验的人回到部队的右边! ?
干杯
UPDATE
我的位置服务会在应用启动时绑定,以尽快获得用户的位置:
if(callConnectService == null) {
callConnectService = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder binder) {
locationServiceBinder = LocationServiceBinder.Stub.asInterface(binder);
try {
global.setLocationBinder(locationServiceBinder);
global.getLocationBinder().startLocationListener();
} catch (Exception e){
Log.e(TAG, "Service binder ERROR");
}
}
public void onServiceDisconnected(ComponentName name) {
locationServiceBinder = null;
}
};
}
/* Launch Service */
aimConServ = new Intent(this, LocationService.class);
boolean bound = bindService(aimConServ,callConnectService,BIND_AUTO_CREATE);
当用户登录时,我的Xmpp服务将启动:
callConnectService = new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder binder) {
try {
Log.d(TAG, "[XMPP_INIT] Complete.");
global.setServiceBinder(ConnectionServiceBinder.Stub.asInterface(binder));
//Connect to XMPP chat
global.getServiceBinder().connect();
} catch (Exception e){
Log.e(TAG, "Service binder ERROR ");
e.printStackTrace();
}
}
public void onServiceDisconnected(ComponentName name) {
Log.e(TAG, "Service binder disconnection ");
}
};
/* Launch Service */
Intent aimConServ = new Intent(MMWelcomeProfile.this, XmppService.class);
bound = bindService(aimConServ,callConnectService,Context.BIND_AUTO_CREATE);
并取消绑定每个Activity:
if (callConnectService != null){
unbindService(callConnectService);
callConnectService = null;
}