成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android使用AIDL實現進程間通信

移動開發 Android
本文通過示例代碼的發放和基本內容的講解,全面闡述了Android如何使用AIDL實現進程間通信的原理和方法。希望通過本文的學習讓廣大讀者有所收貨。

Android的每個應用程序都是一個不同的進程,在Android平臺一個進程通常不能訪問另一個進程的內存空間。
比如一個應用程序有兩個進程,一個進程負責UI的展示,而另一個進程(通常是在此進程中使用一個service)用來進行網絡資源的請求,需要主進程和服務進程之間進行數據的傳遞。(微信就是使用的這種機制)
Android提供了AIDL來實現進程間通信(IPC),AIDL全稱為Android Interface Definition Language。

AIDL IPC機制是面向接口的,使用代理類在客戶端和服務端之間進行數據傳遞。那么如何使用AIDL實現進程間通信呢?

使用AIDL實現IPC服務需要分別實現服務端和客戶端。實例源碼下載:點擊下載

1、新建aidl文件定義服務端和客戶端交互的接口(包括數據接口)
adil文件定義規范:
在服務端的src目錄下新建以.aidl為后綴的文件,在這個文件中定義接口,聲明服務端和客戶端交互的api,語法和普通java接口聲明一樣,可以添加中英文注釋。
區別:
a、除了Java基本數據類型 (int, long, char, boolean等)、String、CharSequence、List、Map外,其他復雜類型都需要顯式import(包括其他AIDL定義的接口),即便是在同一個包內定義。
b、支持泛型實例化的List,如List<String>;不支持泛型實例化的Map,如Map<String, String>。對于List為參數接收者接收到的始終是ArrayList;對于Map為參數接收者接收到的始終是HashMap。
c、interface和函數都不能帶訪問權限修飾符。
d、接口內只允許定義方法,不允許定義靜態屬性。

  1. package com.snail.test.aidl.server;    
  2.     
  3. import com.snail.test.aidl.server.Person;    
  4. interface IAIDLServerService {    
  5.     
  6.      Person getPerson();    
  7. }   

aidl文件新建完成后,adt工具會自動編譯aidl文件,大家可以在gen目錄看到對應的java文件。
文件中主要有:
a、抽象類Stub,繼承Binder實現自定義接口,作用同進程內通信服務中自定義的Binder,客戶端通過它對服務進行調用。
b、靜態類Proxy,實現自定義接口,代理模式接收對Stub的調用。

2、新建service實現定義的接口。

接口中傳遞的對象數據需要實現序列化接口,并且也要定義aidl文件。

  1. public class AIDLServerService extends Service {      
  2.     /**  
  3.      * 返回綁定  
  4.      */   
  5.     @Override   
  6.     public IBinder onBind(Intent intent) {   
  7.         return mBinder;   
  8.     }      
  9.     /**  
  10.      * 初始化根據AIDL文件生成的Stub  
  11.      */   
  12.     private IAIDLServerService.Stub mBinder = new Stub() {      
  13.         /**  
  14.          * 實現定義的接口  
  15.          */   
  16.         public Person getPerson() throws RemoteException {   
  17.             Person mBook = new Person();   
  18.             mBook.setName("Snail");   
  19.             mBook.setAge(27);   
  20.             return mBook;   
  21.         }   
  22.     };      

客戶端:

1、在工程中定義服務端和客戶端交互的接口,跟服務端的一模一樣,包名也要一樣,不然會報錯java.lang.SecurityException: Binder invocation to an incorrect interface。

2、通過Stub.asInterface方法獲取服務來使用定義的接口實現進程間的通信。

  1. public class MainActivity extends Activity {   
  2.    
  3.     private Button mAIDLBtn;   
  4.     private TextView mAIDLView;   
  5.    
  6.     @Override   
  7.     protected void onCreate(Bundle savedInstanceState) {   
  8.         super.onCreate(savedInstanceState);   
  9.         setContentView(R.layout.activity_main);   
  10.         mAIDLBtn = (Button) findViewById(R.id.aidl_btn);   
  11.         mAIDLView = (TextView) findViewById(R.id.aidl_text);   
  12.    
  13.         mAIDLBtn.setOnClickListener(new OnClickListener() {   
  14.             public void onClick(View v) {   
  15.                 // 綁定服務,這里的service action非常重要,要跟server端定義的action一致   
  16.                 Intent service = new Intent(   
  17.                         "com.snail.test.aidl.server.AIDLServerService");   
  18.                 bindService(service, mConnection, BIND_AUTO_CREATE);   
  19.             }   
  20.    
  21.         });   
  22.     }   
  23.    
  24.     private IAIDLServerService mIaidlServerService = null;   
  25.    
  26.     /**  
  27.      * 服務連接  
  28.      */   
  29.     private ServiceConnection mConnection = new ServiceConnection() {   
  30.    
  31.         public void onServiceDisconnected(ComponentName name) {   
  32.             mIaidlServerService = null;   
  33.         }   
  34.    
  35.         /**  
  36.          * 服務連接成功  
  37.          */   
  38.         public void onServiceConnected(ComponentName name, IBinder service) {   
  39.             mIaidlServerService = IAIDLServerService.Stub.asInterface(service);   
  40.             // aidl實現進程間通信   
  41.             try {   
  42.                 Person person = mIaidlServerService.getPerson();   
  43.                 String str = "姓名:" + person.getName() + "\n" + "年齡:"   
  44.                         + person.getAge();   
  45.                 mAIDLView.setText(str);   
  46.             } catch (RemoteException e) {   
  47.                 e.printStackTrace();   
  48.             }   
  49.         }   
  50.     };   
  51. }   

客戶端和服務端的service生命周期:

客戶端通過 bindService綁定服務,若服務未啟動,會先執行Service的onCreate函數,再執行onBind函數,最后執行 ServiceConnection對象的onServiceConnected函數,客戶端可以自動啟動服務。若服務已啟動但尚未綁定,先執行 onBind函數,再執行ServiceConnection對象的onServiceConnected函數。若服務已綁定成功,則直接返回。

經過以上內容的學習,相信大家已經基本掌握了使用AIDL實現進程間通信。

責任編輯:閆佳明 來源: csdn
相關推薦

2020-11-04 07:17:42

Nodejs通信進程

2018-01-12 14:35:00

Linux進程共享內存

2017-06-19 13:36:12

Linux進程消息隊列

2017-08-06 00:05:18

進程通信開發

2010-01-05 10:00:48

Linux進程間通信

2020-11-18 09:06:04

Python

2011-06-22 17:09:50

QT 進程 通信

2024-01-03 10:17:51

Linux通信

2021-01-22 10:58:16

網絡安全進程間碼如

2019-05-13 10:00:41

Linux進程間通信命令

2019-11-08 14:47:49

TCPIP網絡

2018-05-30 13:58:02

Linux進程通信

2011-06-24 14:01:34

Qt QCOP 協議

2019-05-08 11:10:05

Linux進程語言

2014-07-18 09:54:57

vlan路?由?器

2016-10-20 08:46:17

2017-08-07 20:18:11

Android線程handler

2022-02-07 09:10:34

進程通信加鎖

2022-07-04 08:29:13

electron通信

2020-12-01 09:22:43

進程協程開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品中文字幕在线 | 天天天天天天天干 | 国产精品区二区三区日本 | 国产精品久久久久久久久久久久 | 毛片一区二区 | www.狠狠干| 亚洲小视频在线播放 | 精品视频一区二区 | 91精品国产91久久久久久最新 | 四虎免费视频 | 精品久久国产 | 国产精品久久精品 | 欧美日韩成人网 | 日韩不卡视频在线观看 | 国产一级片网站 | 又爽又黄axxx片免费观看 | 看av网址| 日韩中文字幕免费在线观看 | 国产精品久久久久久久久久久久冷 | 中文精品久久 | 一区视频| 久久精品亚洲精品国产欧美 | 欧美日韩中文字幕在线 | 一道本一区二区 | 91视视频在线观看入口直接观看 | 日韩精品一区二区三区四区视频 | 国产精品区一区二区三 | 一区二区三区高清 | 日韩在线观看一区 | 日韩欧美一区二区三区四区 | 日韩精品无码一区二区三区 | 九九热在线观看 | 日韩视频在线一区二区 | 欧美成人自拍视频 | 国产乱码精品一区二区三区五月婷 | 男女羞羞免费网站 | 色噜噜亚洲男人的天堂 | 欧美久久久网站 | 美日韩免费视频 | 在线视频一区二区 | 日韩午夜电影在线观看 |