安卓開發--AIDL研究

pswyjz發表於2021-09-09

AIDL是什麼?

  AIDL (Android Interface Definition Language), Android介面定義語言,Android提供的IPC (Inter Process Communication,程式間通訊)的一種獨特實現。

什麼情況下要使用AIDL

  使用AIDL只有在你允許來自不同應用的客戶端跨程式通訊訪問你的service,並且想要在你的service種處理多執行緒的時候才是必要的。 如果你不需要執行不同應用之間的IPC併發,你應該透過實現Binder建立你的介面,或者如果你想執行IPC,但是不需要處理多執行緒。那麼使用Messenger實現你的介面。

定義一個AIDL介面的步驟

  必須在一個.aidl檔案中使用java程式語言語法定義你的AIDL介面,然後在提供service的應用中和任何繫結到這個service的應用中的原始碼中(在src目錄嚇)儲存它。
  
  當你編譯包含.aidl檔案的應用時,Android SDK工具基於這個.aidl檔案生成一個IBinder介面,並且把它儲存到專案的gen目錄嚇.service必須恰當的實現這個IBinder介面 之後客戶端應用可以繫結到這個服務上,然後從IBinder呼叫方法來執行IPC。

使用AIDL建立一個鄰接的service需要遵循下面的步驟:

1. 建立.aidl檔案 

  這個檔案使用方法簽名定義了語言介面 
  
2.實現這個介面 

  Android SDk工具基於你的.aidl檔案使用java語言生成一個介面 這個介面有一個內部抽象類,叫做Stub,它是繼承Binder並且實現你AIDL介面的 你必須繼承這個Stub類並且實現這些方法
  
3.暴露這個介面給客戶端 

  實現一個service並且覆蓋onBind()方法返回你的Stub實現類。

你的.aidl檔案必須被複制到其他應用程式中來讓他們訪問你service的介面,你必須維護原始介面的支援(向後相容)。

用一個例項來分步驟說明

在server專案中建立.aidl檔案 

  AIDL使用一個簡單的語法讓你宣告一個帶有一個或者多個帶有引數和返回值方法的介面 引數和返回值可以是任何型別,甚至是AIDL生成的介面。
  
  IService.aidl
  

package com.example.aidl;interface IService {    
    String hello(String name); 
}

在server專案中建立服務類

  當你編譯你的應用時,Android SDK工具生成一個.java介面檔案用你的.aidl檔案命名生成的介面包含一個名字為Stub的子類,這是一個它父類的抽象實現,並且宣告瞭.aidl中所有的方法。
  
  Stub也定義了一些輔助的方法,最顯著的就是asInterface(),它是用來接收一個IBinder(通常IBinder傳遞給客戶端的onServiceConnected()回撥方法)並且返回一個Stub介面的例項 。

  一旦你為service實現了介面,你需要把它暴露給客戶端,這樣他們才能繫結到上面 為了給你的service暴露介面,繼承Service並且實現onBind()方法返回一個你實現生成的Stub類。

   AIDLService.java

public class AIDLService extends Service {    

    @Override
    public void onCreate() {        super.onCreate();
    }    @Override
    public IBinder onBind(Intent intent) {        // Return the interface
        return new IService.Stub() {            @Override
            public String hello(String name) throws RemoteException {                // TODO Auto-generated method stub
                return "hello"+name;
            }
        };
    }

在server專案AndroidManifest中申明Service

          
        

把server專案中的aidl檔案帶包複製到client專案中(包名要相同)

MainActivity.java

public class MainActivity extends Activity {

    IService RemoteService; //監聽服務
    private ServiceConnection mConnection = new ServiceConnection() {        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {            // TODO Auto-generated method stub
            Log.i("mConnection", service+"");
            RemoteService = IService.Stub.asInterface(service);            
            try {
                String s= RemoteService.hello("finch");
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }        @Override
        public void onServiceDisconnected(ComponentName name) {            // TODO Auto-generated method stub
            
        }
        
    };    
    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        initService();
    }    //連線服務
        private void initService() {
            Intent i = new Intent( );
            i.setAction("android.intent.action.AIDLService");            boolean ret = bindService(i, mConnection, Context.BIND_AUTO_CREATE);
        }        
        //斷開服務
        private void releaseService() {
            unbindService(mConnection);
            mConnection = null;
        }        
    @Override
    protected void onDestroy() {        super.onDestroy();
        releaseService();
    }
}

原文連結:http://www.apkbus.com/blog-780485-77124.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/755/viewspace-2812413/,如需轉載,請註明出處,否則將追究法律責任。

相關文章