安卓開發--AIDL研究
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
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(); } }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/755/viewspace-2812413/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 安卓開發框架系列開篇安卓框架
- 安卓開發日記4安卓
- go語言安卓開發Go安卓
- 安卓開發日記28安卓
- 安卓開發日記27安卓
- 安卓開發日記14安卓
- 安卓開發日記13安卓
- 安卓開發日記12安卓
- 安卓開發日記17安卓
- 安卓開發日記16安卓
- 安卓開發日記15安卓
- 安卓開發日記26安卓
- 安卓開發日記25安卓
- 安卓開發日記24安卓
- 安卓開發日記19安卓
- 安卓開發日記18安卓
- 安卓開發日記57安卓
- 安卓開發日記56安卓
- 安卓開發日記55安卓
- 安卓開發日記46安卓
- 安卓開發日記45安卓
- 安卓開發日記47安卓
- 安卓開發第一步:安卓面試題安卓面試題
- 自學安卓app開發(一)安卓APP
- 安卓開發小組的反思安卓
- archlinux配置安卓開發環境Linux安卓開發環境
- 5.11安卓開發日記32安卓
- 5.9安卓開發日記31安卓
- 5.12安卓開發日記33安卓
- 5.13安卓開發日記34安卓
- 5.14安卓開發日記35安卓
- 5.16安卓開發日記37安卓
- 安卓開發之星座查詢安卓
- 安卓開發:安卓底部選單欄的實現,RadioGroup 和Fragment安卓Fragment
- 安卓開發入門(一)開發環境搭建安卓開發環境
- 安卓(Android)開發基礎知識安卓Android
- 安卓開發之呼叫攝像頭安卓
- Mac 配置 Flutter 安卓開發環境MacFlutter安卓開發環境