bindService不调用onServiceConnected的问题
昨天做一个项目时,Activity需要bindService获取到service实例与service进行交互,创建好service如下(例):
class MyService{private IBinder mBinder = new MyServicerBinder();@Overridepublic 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() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mService = ((MyService.MyServiceBinder) service).getService();}@Overridepublic void onServiceDisconnected(ComponentName name) {mService = null;}
};
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = new Intent(this, MyService.class);//绑定servicebindService(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方法下,就不会出错了。
目前没有找到更为优雅的解决办法,如有大神路过请不吝赐教。