android程序間通訊:使用AIDL
from: http://blog.csdn.net/saintswordsman/article/details/5130947
歡迎閱讀本文,你能關注本文,你知道你需要程序間通訊、需要AIDL(以及Binder),那麼可以預設你對這些概念已經有了一些瞭解,你(大致)知道它們是什麼,它們有什麼用,所以為了節約大家的眼力和時間,在此我不復制貼上網上氾濫的部落格或者翻譯冗長的android文件。
關於AIDL的介紹在文件:docs/guide/developing/tools/aidl.html
關於IBinder的介紹在文件:docs/reference/android/os/IBinder.html
以及Binder:docs/reference/android/os/Binder.html
在後文中,我將以我自己的理解向你介紹相關的概念。以我目前粗淺的經驗,應用程式使用AIDL的地方,幾乎都和Service有關,所以你也需要知道一些關於Service的知識。日後得閒我也會繼續寫一些關於Service的貼。
本文將以一個例子來和你分享使用AIDL的基礎技能,這個例子裡有:
1、一個類mAIDLActivity,繼承Activity。裡面有三個按鈕,text分別為StartService,StopService,CallbackTest。
2、一個類mAIDLService,繼承Service。為了充分展示ADIL的功能,它做以下工作:當用戶點選CallbackTest按鈕時,從mAIDLActivity呼叫mAIDLService中的Stub 物件的一個方法invokCallBack(),而這個方法又會呼叫mAIDLActivity中Stub 物件的一個方法performAction(),這個方法在螢幕上顯示一個toast。沒什麼意義,只是展示一下AIDL如何使用。
3、兩個AIDL檔案:forService.aidl和forActivity.aidl。對應名字,在Service和Activity中分別有物件需要用到它們定義的介面。
4、相關XML檔案,略過。關於manifest中Service的語法,見docs/guide/topics/manifest/service-element.html。你也可以簡單地在<application></application>中加入
<service android:name=".mAIDLService" android:process=":remote"> </service>
開發環境為Eclipse。
揀重要的先說,來看看aidl檔案的內容:
檔案:forActivity.aidl
- package com.styleflying.AIDL;
- interface forActivity {
- void performAction();
- }
檔案:forService.aidl
- package com.styleflying.AIDL;
- import com.styleflying.AIDL.forActivity;
- interface forService {
- void registerTestCall(forActivity cb);
- void invokCallBack();
- }
這兩個檔案和Java檔案放置的地方一樣,看包名。
在Eclipse中它們將被自動編譯為forActivity.java和forService.java,它們存放在gen目錄下。為了方便手頭無法演練的讀者,程式碼貼上,不用細看。
檔案forActivity.java:
- /*
- * This file is auto-generated. DO NOT MODIFY.
- * Original file: D://workspace//AIDLTest//src//com//styleflying//AIDL//forActivity.aidl
- */
- package com.styleflying.AIDL;
- import java.lang.String;
- import android.os.RemoteException;
- import android.os.IBinder;
- import android.os.IInterface;
- import android.os.Binder;
- import android.os.Parcel;
- publicinterface forActivity extends android.os.IInterface
- {
- /** Local-side IPC implementation stub class. */
- publicstaticabstractclass Stub extends android.os.Binder implements com.styleflying.AIDL.forActivity
- {
- privatestaticfinal java.lang.String DESCRIPTOR = "com.styleflying.AIDL.forActivity";
- /** Construct the stub at attach it to the interface. */
- public Stub()
- {
- this.attachInterface(this, DESCRIPTOR);
- }
- /**
- * Cast an IBinder object into an forActivity interface,
- * generating a proxy if needed.
- */
- publicstatic com.styleflying.AIDL.forActivity asInterface(android.os.IBinder obj)
- {
- if ((obj==null)) {
- returnnull;
- }
- android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
- if (((iin!=null)&&(iin instanceof com.styleflying.AIDL.forActivity))) {
- return ((com.styleflying.AIDL.forActivity)iin);
- }
- returnnew com.styleflying.AIDL.forActivity.Stub.Proxy(obj);
- }
- public android.os.IBinder asBinder()
- {
- returnthis;
- }
- @Overridepublicboolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
- {
- switch (code)
- {
- case INTERFACE_TRANSACTION:
- {
- reply.writeString(DESCRIPTOR);
- returntrue;
- }
- case TRANSACTION_performAction:
- {
- data.enforceInterface(DESCRIPTOR);
- this.performAction();
- reply.writeNoException();
- returntrue;
- }
- }
- returnsuper.onTransact(code, data, reply, flags);
- }
- privatestaticclass Proxy implements com.styleflying.AIDL.forActivity
- {
- private android.os.IBinder mRemote;
- Proxy(android.os.IBinder remote)
- {
- mRemote = remote;
- }
- public android.os.IBinder asBinder()
- {
- return mRemote;
- }
- public java.lang.String getInterfaceDescriptor()
- {
- return DESCRIPTOR;
- }
- publicvoid performAction() throws android.os.RemoteException
- {
- android.os.Parcel _data = android.os.Parcel.obtain();
- android.os.Parcel _reply = android.os.Parcel.obtain();
- try {
- _data.writeInterfaceToken(DESCRIPTOR);
- mRemote.transact(Stub.TRANSACTION_performAction, _data, _reply, 0);
- _reply.readException();
- }
- finally {
- _reply.recycle();
- _data.recycle();
- }
- }
- }
- staticfinalint TRANSACTION_performAction = (IBinder.FIRST_CALL_TRANSACTION + 0);
- }
- publicvoid performAction() throws android.os.RemoteException;
- }
檔案forService.java:
-
相關推薦
android程序間通訊:使用AIDL
from: http://blog.csdn.net/saintswordsman/article/details/5130947 歡迎閱讀本文,你能關注本文,你知道你需要程序間通訊、需要AIDL(以及Binder),那麼可以預設你對這些概念已經有了一些
Android 程序間通訊(AIDL)
在Android平臺,一個程序通常不能訪問另一個程序的記憶體空間,所以要想對話,需要將物件分解成作業系統可以理解的基本單元,並且有序的通過程序邊界。通過程式碼來實現這個資料傳輸過程是冗長乏味的,Android提供了AIDL工具來處理這項工作。 AIDL (An
android程序間通訊AIDL的簡單實現。
aidl程序間通訊,肯定是兩個程序之間了,我們可以簡單的將其分為服務端和客戶端,客戶端負責發起一個求和的請求,服務端則負責執行這個求和的動作並將求和的結果返回給客戶端。 先看看服務端的程式碼建立吧,用的開發工具是AndroidStudio,右鍵新建aidl檔案,程式碼如下
android程序間通訊--Binder
深入理解之程序間通訊–Binder 同一個程式中的兩個方法能夠直接呼叫的根本原因是處於相同的記憶體空間中。兩個不同的應用程式因為不在同一個程序中,他們是沒有辦法直接通過記憶體地址來訪問到對方的函式和變數的。同一個程序中物件的傳遞是傳遞的記憶體地址,這個地址並不是真正的實體地址,而是邏
8.程序間通訊:有名管道fifo
有名管道fifo 1.特點: 半雙工 有名管道 在磁碟上有這樣一個檔案ls -l ->p 偽檔案,在磁碟大小永遠為0,資料實際上存放在核心中的緩衝區中 2.使用場景 無血緣關係的程序間通訊(兩個不相干的程序) 3.建立方式 1.命令:mkfifo 管道名 2.函
7.程序間通訊:匿名管道pipe
匿名管道pipe 1.管道的概念 本質: 核心緩衝區 偽檔案-不佔用磁碟空間 特點:兩部分 讀端,寫端,對應兩個檔案描述符 資料寫端流入,讀端流出 操作管道的程序被銷燬後,管道自動被釋放 管道預設是阻塞的 2.管道的原理 內部實現方式:環形佇列 特點:先進先出,不能操作中
9.程序間通訊:mmap記憶體對映區
1.父子程序永遠共享的東西 檔案描述符 記憶體對映區 2.使用mmap[父子]程序間通訊 父子程序通訊,怎麼找到同一個mmap記憶體對映區? 答: 返回值ptr 檔案描述符fd int main(){
Android程序間通訊——ContentProvider的使用
前言 ContentProvider作為四大元件之一,一直以來存在感都很低,但其實它的功能還是很強大的,尤其是在實現程序間通訊的時候。和AIDL一樣,ContentProvider的底層實現也是Binder,但是由於系統已經為我們做了封裝,所以它的使用過程要簡單的多。 一、什麼是Conten
程序間通訊:訊號
執行以下程式碼,在終端運用kill命令向該程序傳送訊號 ,測試哪個中斷不能被自己所寫的函式接管 #include <stdio.h> #include <signal.h> #include <unistd.h> void handler (int num) {
程序間通訊:無名管道
無名管道只能在有親緣關係的程序間通訊 #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <errno.h> int main() { int
Android程序間通訊 - 幾種方式的對比總結
什麼是RPC RPC(Remote Procedure Call)即遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,在不需要了解底層網路技術的協議下,即可獲取計算機程序中的資料。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。 RPC在OSI網路通訊7層模型中
Android程序間通訊 - Socket使用(TCP、UDP)
在使用Socket實現程序間通訊前,先對網路協議相關知識進行簡單回顧。 網路分層 一般情況會將網路分為5層: 應用層 常見協議:HTTP、FTP、POP3等 傳輸層
Android程序間通訊 - ContentProvider內容提供者
簡介 ContentProvider主要用於在不同的應用程式間實現資料共享的功能,允許一個程式訪問另外一個程式中的資料,還能保證資料訪問的安全性。 是Android跨程序實現資料共享的標準方式。 ContentProvider相當於程序間的搬運工,
Linux 多工程式設計——程序間通訊:無名管道(PIPE)
管道的概述 管道也叫無名管道,它是是 UNIX 系統 IPC(程序間通訊) 的最古老形式,所有的 UNIX 系統都支援這種通訊機制。 無名管道有如下特點: 1、半雙工,資料在同一時刻只能在一個方向上流動。 2、資料只能從管道的一端寫入,從另一端讀出。 3、寫入管道中的資料遵循先入先出
Linux 多工程式設計——程序間通訊:訊號中斷處理
什麼是訊號? 訊號是 Linux 程序間通訊的最古老的方式。訊號是軟體中斷,它是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊的方式 。訊號可以導致一個正在執行的程序被另一個正在執行的非同步程序中斷,轉而處理某一個突發事件。 “中斷”在我們生活中經常遇到,譬如,我正在房間裡打遊戲,
Android程序間通訊的幾種方式
定義多程序 Android應用中使用多程序只有一個辦法(用NDK的fork來做除外),就是在AndroidManifest.xml中宣告元件時,用android:process屬性來指定。 不知定process屬性,則預設執行在主程序中,主程序名字為包名。 andr
Linux系統程式設計——程序間通訊:共享記憶體
概述 共享記憶體是程序間通訊中最簡單的方式之一。共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc() 函式向不同程序返回了指向同一個實體記憶體區域的指標。當一個程序改變了這塊地址中的內容的時候,其它程序都會察覺到這個更改。 共享記憶體的特點: 1)共
Linux系統程式設計——程序間通訊:訊息佇列
概述 訊息佇列提供了一種在兩個不相關的程序之間傳遞資料的簡單高效的方法,其特點如下: 1)訊息佇列可以實現訊息的隨機查詢。訊息不一定要以先進先出的次序讀取,程式設計時可以按訊息的型別讀取。 2)訊息佇列允許一個或多個程序向它寫入或者讀取訊息。 3)與無名管道、命名管道一
Linux系統程式設計——程序間通訊:管道(pipe)
管道的概述 管道也叫無名管道,它是是 UNIX 系統 IPC(程序間通訊) 的最古老形式,所有的 UNIX 系統都支援這種通訊機制。 無名管道有如下特點: 1、半雙工,資料在同一時刻只能在一個方向上流動。 2、資料只能從管道的一端寫入,從另一端讀出。
Linux系統程式設計——程序間通訊:訊號中斷處理
什麼是訊號? 訊號是 Linux 程序間通訊的最古老的方式。訊號是軟體中斷,它是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊的方式 。訊號可以導致一個正在執行的程序被另一個正在執行的非同步程序中斷,轉而處理某一個突發事件。 “中斷”在我們生活中經常遇到,譬如,我正在