Android BindService中遇到的一個小問題


   今天在使用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和應用程序之間的交互是異步的。
 
        
 
         
         
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM