Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android] AIDL的使用情況和實例介紹

[Android] AIDL的使用情況和實例介紹

編輯:關於Android編程

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<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush: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(); } }

運行結果:

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved