bindService不调用onServiceConnected的问题
昨天做一个项目时,Activity需要bindService获取到service实例与service进行交互,创建好service如下(例):
class MyService{
private IBinder mBinder = new MyServicerBinder();
@Override
public IBinder onBind(Intent intent){
return mBinder;
}
.... //service其他生命周期方法
public class MyServiceBinder extends Binder{
public MyService getService(){
return MyService.this;
}
}
//测试方法
public void doSomething(){
}
}
在AndroidManifest.xml中注册:
<service android:name=".MyService"/>
调用:
private MyService mService;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = ((MyService.MyServiceBinder) service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
};
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MyService.class);
//绑定service
bindService(intent, connection, Context.Context.BIND_AUTO_CREATE);
//测试是否拿到service实例
mService.doSomething();
结果在mService.doSomething()行报错,mService为空。看上去已经调用bindService,为什么mService还是为空?通过设置断点发现onServiceConnected方法并没有调用,于是各处查资料,尝试过的方法包括:
1. 绑定时使用application的上下文:
getApplicationContext.bindService()
2. 注册时Service节点使用完整的包名
<service android:name="com.liuconen.example.MyService"/>
以上方法仍然没有解决,直到在stackOverFlow上看到一位大牛的回答:
地址为:
http://stackoverflow.com/questions/9246657/serviceconnection-onserviceconnected-never-called-after-binding-to-started-ser?newreg=2632e05fed454a96b271b008c0b56154
大意是,onServiceConnected在绑定成功时进行回调,但不保证在执行binService后立马回调,我们在onCreate方法中绑定后立马获取service实例,但此时不保证onServiceConnected已经被回调。 也就是我们onCreate方法执行时onServiceConnected还没有别调用。此时当然mService还为空了。
按照这位答者的解决,把对mService进行引用的操作放在onServicerConnected方法下,就不会出错了。
目前没有找到更为优雅的解决办法,如有大神路过请不吝赐教。