標籤:filter object tar cte 需要 定位 ring 用法 getname
1、AIDL (Android Interface Definition Language )
2、AIDL 適用於 處理序間通訊,並且與Service端多個線程並發的情況,如果只是單個線程 可以使用 Messenger ,如果不需要IPC 可以使用Binder
3、AIDL文法:基礎資料類型都可以適用,List Map等有限適用。static field 不適用。
4、AIDL基本用法
第一步:實現.aidl檔案
介面描述檔案1、匯入的包名2、如果有使用Object對象,需要該對象 implement Parcelable 介面,並且需要匯入該介面包名+類名; 如果是primitive type 不需要這步。3、定義方法名稱。4、所有的.aidl檔案已經需要傳遞的對象介面需要在Service 與Client中各一份package com.aidl;import com.aidl.Data;interface IaidlData{ int getPid(); String getName(); com.aidl.Data getData();}
2、在Service中實現.aidl 介面。實際實現的介面是在 gen中自動產生的 IaidlData.java的抽象內部類 Stub
1、需要在設定檔Androidmanifest.xml檔案中聲明Service,並且添加intent-filter 節點 的action屬性, 此屬性一般可以使用 aidl的包名+檔案名稱(因為該值在伺服器與用戶端一致)2、需要實現IaidlData.aidl檔案中定義的介面。 aidl檔案是一個介面描述檔案,會在gen中自動產生一個同名的IaidlData.java介面檔案,該介面檔案包含一個抽象類別stub,其繼承了android.os.Binder、實現IaidlData介面 故,我們實際需要實現的是Stub抽象類別。public class AidlService extends Service{ public void onCreate() { Log.d("aidl", "aidlService--------------onCreate"); } public IBinder onBind(Intent intent) { return mBinder; } private final IaidlData.Stub mBinder = new IaidlData.Stub() { public int getPid() { return Process.myPid(); } public String getName() throws RemoteException { return "go or not go is a problem"; } public Data getData() throws RemoteException { Data data = new Data(); data.id = Process.myPid(); data.name = "go or not go is a problem"; return data; } };}
3、綁定Service ,並且擷取IaidlService 對象
1、建立串連,使用Action屬性定位需要的Service actoin的屬性的採用aidl檔案的類名+包名(與服務一致),之前需要在服務中設定相同的action屬性,否則找不到服務。2、擷取服務返回的stub對象,mIaidlData = IaidlData.Stub.asInterface(service);package com.clent;import com.aidl.IaidlData;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import android.view.View;public class AidlClientActivity extends Activity{ IaidlData mIaidlData; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } protected void onStart() { super.onStart(); Log.d("aidl" , "onstart ----------bindservice-----"+IaidlData.class.getName()); Intent intent = new Intent(IaidlData.class.getName()); bindService(intent, mSecondaryConnection, BIND_AUTO_CREATE); } private ServiceConnection mSecondaryConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { Log.d("aidl", "onServiceConnected----------------"); mIaidlData = IaidlData.Stub.asInterface(service); } public void onServiceDisconnected(ComponentName className) { mIaidlData = null; } }; public void onClick(View view) { System.out.println( " onclick--------------- : "); if(mIaidlData != null) { try { System.out.println( " name : "+mIaidlData.getName()); System.out.println( " id : "+mIaidlData.getPid()); System.out.println( " data : "+mIaidlData.getData().id +" "+mIaidlData.getData().name); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } protected void onDestroy() { super.onDestroy(); unbindService(mSecondaryConnection); }}
4、如果aidl檔案中需要傳遞Object對象,需要添加對應的.aidl檔案
1、定義該對象Data,並實現Parcelable2、添加Data.aidl檔案,並採用如下方式編寫匯入Data3、需要在引用到Data的.aidl檔案中 import com.aidl.Data4、需要在服務端和 用戶端都添加 Data.aidl與 Data.java檔案 並且需要一致。Data.aidlaidl檔案:package com.aidl;parcelable Data;
5、添加 對應的Object類,並且實現Parcelable介面
public class Data implements Parcelable{ public int id; public String name; public static final Parcelable.Creator<Data> CREATOR = new Parcelable.Creator<Data>() { public Data createFromParcel(Parcel in) { return new Data(in); } public Data[] newArray(int size) { return new Data[size]; } }; public Data() { } private Data(Parcel in) { readFromParcel(in); } public void readFromParcel(Parcel in) { id = in.readInt(); name = in.readString(); } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); }}
Android AIDL 小結