Android AIDL 小結

來源:互聯網
上載者:User

標籤: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 小結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.