基於Android AIDL處理序間通訊介面使用介紹

來源:互聯網
上載者:User

AIDL:Android Interface Definition Language,它是一種android內部進程通訊介面的描述語言,通過它我們可以定義進程間的通訊介面。

ICP:Interprocess Communication ,內部進程通訊。

使用:

1、先建立一個aidl檔案,aidl檔案的定義和java代碼類似,但是!它可以引用其它aidl檔案中定義的介面和類,但是不能引用自訂的java類檔案中定義的介面和類,要引用自訂的介面或類,需要為此類也定義一個對應的aidl檔案,並且此類要實現Parcelable介面,同時aidl檔案和類檔案必須要在相同包下進行聲明;Android包含了aidl編譯器,當定義好一個aidl檔案的時候,會自動編譯產生一個java檔案,此檔案儲存在gen目錄之下。

在這個項目中,定義了兩個aidl檔案,其中Person實現了介面Parcelable,下面是這兩個aidl檔案的定義:

Person.aidl

{

parcelable Person;

}

IAIDLServerService.aidl

{

  package com.webview;
  import com.webview.Person;// 引用上面的Person.aidl

  interface IAIDLServerService{
    String sayHello();
    Person getPerson();
  }

}

2、編寫一個Service實現定義aidl介面中的內部抽象類別Stub,Stub繼承自Binder,並繼承我們在aidl檔案中定義的介面,我們需要實現這些方法。Stub中文意思存根,Stub對象是在服務端進程中被調用,即服務端進程。

在用戶端調用服務端定義的aidl介面對象,實現Service.onBind(Intent)方法,該方法會返回一個IBinder對象到用戶端,綁定服務時需要一個ServiceConnection對象,此對象其實就是用來在用戶端綁定Service時接收Service返回的IBinder對象。

||public static abstract class Stub extends android.os.Binder implements com.webview.IAIDLServerService

public class AIDLServerService extends Service{@Overridepublic IBinder onBind(Intent intent) {return binder;}private IAIDLServerService.Stub binder = new Stub() {@Overridepublic String sayHello() throws RemoteException {return "Hello AIDL";}@Overridepublic Person getPerson() throws RemoteException {Person person = new Person();person.setName("Livingstone");person.setAge(22);return person;}};}

3、在服務端註冊Service,將如下代碼添加進Application節點之下!

<service android:name="com.webview.AIDLServerService"
  android:process=":remote">
  <intent-filter>
    <action android:name="com.webview.IAIDLServerService"></action>
  </intent-filter>
</service>

至此,服務端進程定義已經完成!

4、編寫用戶端,注意需要在用戶端存一個服務端實現了的aidl介面描述檔案,用戶端只是使用該aidl介面,擷取服務端的aidl對象(IAIDLServerService.Stub.asInterface(service))之後就可以調用介面的相關方法,而對象的方法的調用不是在用戶端執行,而是在服務端執行。

public class MainActivity extends Activity {private Button btn;private IAIDLServerService aidlService = null;
private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {aidlService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {aidlService = IAIDLServerService.Stub.asInterface(service);try {aidlService.doFunction();// 執行介面定義的相關方法} catch (RemoteException e) {e.printStackTrace();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.button);tv = (TextView) findViewById(R.id.textview);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent service = new Intent("com.webview.IAIDLServerService");bindService(service, conn, BIND_AUTO_CREATE);// 綁定服務}});}}

用戶端目錄結構:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.