今天在使用BindService的時候遇到個小問題,我希望通過Bindservice獲取到這個服務,然后執行服務內的某個自定義方法,如下:
if(bindService==null){ Intent serviceintent=new Intent(this,MyService.class); bindService(serviceintent,conn,Context.BIND_AUTO_CREATE); // startService(serviceintent); } Log.i("", "afterbingd"); bindService.play(linename,stationname,Integer.parseInt(stationid),"2");
conn代碼如下
private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub bindService=null;//解除綁定 } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub MyBinder binder = (MyBinder)service; bindService = binder.getService();//綁定服務 } };
這里邏輯是沒錯的,綁定service之后把service賦值給bindService對象,然后通過這個對象執行play方法。但是程序卻報錯了,調試的時候居然發現無法進入服務的onCreate之類的方法,但確信已經執行了這些方法的,所以只能通過設置Log的方法,最后發現,原來bindService方法會異步執行。通過設置Log發現,在上述過程中,會先執行
Log.i("", "afterbingd") 再去執行Myservice中的onCreate 和onBind。真正判斷連接是否成功的事件是ServiceConnection接口里的onServiceConnected事件,所以需要把綁定成功后的處理邏輯移到這個方法內執行。
注:如果對Android 框架層做過深入了解的話,就能很清楚的理解為什么會這樣了。Service的綁定操作其實需要涉及到和AMS(ActivityManageService)的交互,AMS在成功注冊了Service后通過Binder機制通知ActivityThread來執行Service的各種回調函數,而ActivityThread又是通過Hander來保證AMS和應用程序之間的交互是異步的。
