1. 程式人生 > >aidl的簡單快速入門

aidl的簡單快速入門

原文連結  http://blog.csdn.net/double2hao/article/details/51626347  侵刪

為何要開啟多程序?主要有兩種情況:

一、一個應用由於自身需要採用多程序模式來實現。比如播放器之類,如果僅僅在service中執行會影響主執行緒的響應速度,很可能會造成ANR,一般情況下不會這麼寫;如果僅僅在子執行緒中執行,一旦開啟該執行緒的Activity被殺死後,執行緒也被殺死,無法實現後臺執行效果,更加不合理。而如果在另外一個程序中使用service後臺執行,就顯得十分恰當了。

二、由於android對單個應用所使用的最大記憶體做了限制,為了加大一個應用可使用的記憶體,所以通過多程序來獲取多份記憶體空間。

本篇文章demo重點:(demo原始碼在文章結尾)

1、開啟多程序

2、兩個程序之間使用AIDL進行通訊

開啟多程序:

在Android中常用的使用多程序只有一種辦法,那就是在AndroidManifest中為四大元件(Activity、Service、Broadcast Receiver、ContentProvier)指定android:process屬性。筆者demo中的遠端service如下圖:


最終繫結該service後在DDMS中程序的顯示情況如下圖:


可以看到最後的兩個程序都是同一個包名,只是第二個是“:remote”。這樣就非常簡單的開啟了多程序。

講到此處,很多好奇的讀者定然有疑問了,“android:process”中的引數到底代表了什麼?簡單來講就是代表了新開的這個程序的id。如果兩個應用要共享同一個程序就需要用到這個了。

那麼筆者此處寫的“:remote”又是什麼意思呢?“remote”不是關鍵,這個完全可以自己隨意取名字,“:”冒號才是關鍵

程序名以“:”開頭的程序屬於當前應用的私有程序,其他應用的元件不可以和它跑在同一個程序中。而程序名不以“:”開頭的程序屬於全域性程序,其他應用可以通過某些方式和它跑在同一個程序中。

兩個程序之間使用AIDL進行通訊:

筆者此篇文章實現的主要效果:

能夠在當前程序中MainActivity,執行另一個程序中開啟的Service中實現的方法testMethod(),方法與最終效果如下:



介面上主要有兩個按鈕,第一個是開啟遠端程序中的Service,另一個為執行該方法。


主要實現步驟:(主要有三條,分別為AIDL、Service、和呼叫處(demo中為MainActivity))

1、建立一個AIDL介面,並寫入自己要在程序間通訊用的抽象方法。

myAIDL.aidl:

  1. package com.example.double2.myaidltest;  
  2. interface myAIDL {  
  3.     void testMethod();  
  4. }  

建立AIDL檔案與建立java檔案等類似,直接右擊建立即可。android studio中就十分方便,會自動在main檔案下建立一個aidl資料夾,並在該資料夾創建於你專案名相同的包名。

可能遇到的小問題:

筆者第一次建立AIDL,在Service中發現找不到該AIDL的包。遇到相同問題的讀者可以在建立AIDL並寫完抽象方法之後使用build->make project重新構建一下專案。


2、建立一個遠端Service,在Service中建立一個類繼承AIDL介面中的Stub類並實現Stub中的抽象方法,最後不要忘記在onBind中返回這個類的物件。

  1. publicclass AIDLRemoteService extends Service {  
  2.     privatestaticfinal String TAG = "AIDLRemoteService";  
  3.     privatefinal myAIDL.Stub mBinder=new myAIDL.Stub(){  
  4.         @Override
  5.         publicvoid testMethod() throws RemoteException {  
  6.             Log.d(TAG, "testMethod: "+"this is myAIDLTest");  
  7.         }  
  8.     };  
  9.     @Override
  10.     public IBinder onBind(Intent intent) {  
  11.         return mBinder;  
  12.     }  
  13. }  

3、在要呼叫的地方(筆者demo中就為MainActivity中)繫結該Service,將Service返回的Binder物件轉換成AIDL介面所屬的型別,接著直接呼叫AIDL的方法。

在成功連線之後,將Service返回的Binder物件轉換成AIDL介面所屬的型別:

  1. private myAIDL mMyAIDL;  
  2.     private ServiceConnection mServiceConnection = new ServiceConnection() {  
  3.         @Override
  4.         publicvoid onServiceConnected(ComponentName name, IBinder service) {  
  5.             Log.e(TAG, "onServiceConnected");  
  6.             mMyAIDL = myAIDL.Stub.asInterface(service);  
  7.         }  
  8.         @Override
  9.         publicvoid onServiceDisconnected(ComponentName name) {  
  10.             Log.e(TAG, "onServiceDisconnected");  
  11.             mMyAIDL = null;  
  12.         }  
  13.     };  

在呼叫處直接使用:

  1. btnStartMethod.setOnClickListener(new View.OnClickListener() {  
  2.             @Override
  3.             publicvoid onClick(View v) {  
  4.                 try {  
  5.                     mMyAIDL.testMethod();  
  6.                 } catch (RemoteException e) {  
  7.                     Toast.makeText(MainActivity.this"服務被異常殺死,請重新開啟。", Toast.LENGTH_SHORT).show();  
  8.                 }  
  9.             }  
  10.         });  


demo專案結構:


myAIDL.aidl:

  1. package com.example.double2.myaidltest;  
  2. interface myAIDL {  
  3.     void testMethod();  
  4. }  
AIDLRemoteService:
  1. package com.example.double2.myaidltest;  
  2. import android.app.Service;  
  3. import android.content.Intent;  
  4. import android.os.IBinder;  
  5. import android.os.RemoteException;  
  6. import android.util.Log;  
  7. /** 
  8.  * 專案名稱:MyAIDLTest 
  9.  * 建立人:Double2號 
  10.  * 建立時間:2016/6/10 8:13 
  11.  * 修改備註: 
  12.  */
  13. publicclass AIDLRemoteService extends Service {  
  14.     privatestaticfinal String TAG = "AIDLRemoteService";  
  15.     privatefinal myAIDL.Stub mBinder=new myAIDL.Stub(){  
  16.         @Override
  17.         publicvoid testMethod() throws RemoteException {  
  18.             Log.d(TAG, "testMethod: "+"this is myAIDLTest");  
  19.         }  
  20.     };  
  21.     @Override
  22.     public IBinder onBind(Intent intent) {  
  23. 相關推薦

    aidl簡單快速入門

    原文連結  http://blog.csdn.net/double2hao/article/details/51626347  侵刪 為何要開啟多程序?主要有兩種情況: 一、一個應用由於自身需要採用多程序模式來實現。比如播放器之類,如果僅僅在servi

    php-laravel4.0框架 簡單快速入門

    web服務 正則表達式 view 遷移 cor isa content 文件配置 end 前提必須已經安裝好了laravel4.0版本。 寫入權限:  安裝完 Laravel ,你還需要為web服務器設置 app/storage 目錄的寫入權限。 目錄結構:  安裝完框

    spring-data-jpa快速入門(二)——簡單查詢

    ref spa data mail domain event cif open 寫實 一、方法名解析   1.引言     回顧HelloWorld項目中的dao接口 public interface GirlRepository extends JpaRepos

    Java快速入門-04-Java.util包簡單總結

    安全 一個 mutex int 順序表 rem 額外 指針 鏈表實現 學Java的程序員,lang包和util包最好是要過一遍的。 建議大家都序下載一個離線版開發文檔,查閱非常方便,我給大家提供一個中文版 jdk1.8 離線文檔,查看:JAVA - JDK 1.8 AP

    Spring基礎:快速入門spring boot(7):spring boot 2.0簡單介紹

    從這篇文章開始以spring boot2為主要版本進行使用介紹。 Spring boot 2特性 spring boot2在如下的部分有所變化和增強,相關特性在後續逐步展開。 特性增強 基礎元件升級: JDK1.8+ tomcat 8+ Thymeleaf 3

    Hadoop快速入門(WordContent簡單應用)

    Hadoop快速入門  WordContent簡單應用 Hadoop的HelloWorld程式 建立HDFS目錄 hdfs命令位於bin目錄下,通過hdfs dfs -mkdir命令可以建立一個目錄。 [[email protected] hadoop-2.7.3]# bi

    JAVA WEB快速入門之通過一個簡單的Spring專案瞭解Spring的核心(AOP、IOC)

    接上篇《JAVA WEB快速入門之從編寫一個JSP WEB網站了解JSP WEB網站的基本結構、除錯、部署》,通過一個簡單的JSP WEB網站了解了JAVA WEB相關的知識,比如:Servlet、Fitler、Listner等,這為後面搭建基於SSM的框架奠定了基礎知識,當然光了解JSP相關的知識還不行,我

    mongodb 中的 map reduce 的快速入門例子,簡單操作和理解。

    先看下mongodb官方給出的例子的圖。 個人理解的解釋: 這個圖,有四列資料。 第一列:原始資料。通常對應的mongodb裡面的一個表collection。 第二列:經過某些條件過濾過的資料,這個圖裡面就是按{"status":"A"}過濾資料。這個過濾的條件對應上面程式

    Maven入門指南 Maven 快速入門簡單使用

    1.0 用戶名 resource 剛才 pro jdk 軟件 基金 oca Maven入門指南 :Maven 快速入門及簡單使用 前言 Maven是一個Java語言編寫的開源項目管理工具,是Apache軟件基金會的頂級項目。主要用於項目構建,依賴管理,項目信息

    Maven入門指南 Maven 快速入門簡單使用

    Maven入門指南 :Maven 快速入門及簡單使用 前言       Maven是一個Java語言編寫的開源專案管理工具,是Apache軟體基金會的頂級專案。主要用於專案構建,依賴管理,專案資訊管理。       maven專案在

    Vue快速入門-1-Vue的簡單使用

    小生部落格:http://xsboke.blog.51cto.com如果有疑問,請點選此處,然後發表評論交流,作者會及時回覆。 -------謝謝您的參考,如有疑問,歡迎交流 目錄: 1. 簡單的將資料渲染到DOM 2. Vue的"v-"指令 3. "v-if"指令的

    Maven 系列 一 :Maven 快速入門簡單使用【轉】

    開發環境 MyEclipse 2014 JDK 1.8 Maven 3.2.1 1.什麼是Maven? Maven是一個專案管理工具,主要用於專案構建,依賴管理,專案資訊管理。 2.下載及安裝 解壓檔案: 配置環境變數(需要先配置好%JAVA_HOME%環境變數): 檢視

    Retrofit 最簡單快速入門及封裝

    Retrofit是Square公司開發的一款針對Android網路請求的框架,Retrofit2底層基於OkHttp實現的,OkHttp現在已經得到Google官方認可,大量的app都採用OkHttp做

    Thymeleaf 快速入門(2)簡單表示式

    2.1.1變量表達式:${…} 模板名稱:var.html 原理類似OGNL/SpringEL表示式 e.g. 1. Established locale country: <span th:text="${#locale.country}"

    sqlite快速入門手冊-真的很簡單

    它的特點是:極小、資料庫、效能不錯。 適合場景:小型應用軟體,解決存檔案的不便 解壓後只有個sqlite3.exe,這就夠了。將它拷貝到第一個方便使用的地方去吧。 建立個庫: cmd視窗進入exe目錄,使用sqlite3.exe test.db建立庫,

    簡單的dubbo教程-快速入門《一》

    所需環境 開始搭建 1. 服務提供方和消費方都需要的包(這裡我新建的maven工程為pom工程,將共同的專案依賴寫到pom.xml中) 總的專案結構為 pom.xml檔案內容為

    快速入門android AIDL(開啟多程序並進行通訊)

    為何要開啟多程序?主要有兩種情況:一、一個應用由於自身需要採用多程序模式來實現。比如播放器之類,如果僅僅在service中執行會影響主執行緒的響應速度,很可能會造成ANR,一般情況下不會這麼寫;如果僅僅在子執行緒中執行,一旦開啟該執行緒的Activity被殺死後,執行緒也被殺

    W5500簡單使用及官方IO庫 快速入門

    簡介 前段時間折騰了好久W5500模組。已經通過其實現了基於TCP/IP的bootloader。基於輪詢的方式下能保證穩定可靠地呼叫協議棧,下一篇中已放出驅動模組及示例程式碼;基於中斷的基本能用,但還沒信心穩定可靠,還在繼續折騰。 這個網路晶片通過硬體實現了TC

    Maven 快速入門簡單使用

    開發環境 MyEclipse 2014JDK 1.8Maven 3.2.1 1.什麼是Maven? Maven是一個Java語言編寫的開源專案管理工具,是Apache軟體基金會的頂級專案。主要用於專案構建,依賴管理,專案資訊管理。百度百科 2.下載及安裝 下載最新版 Maven:apache-maven

    MyBatis 學習總結(一)——MyBatis 簡單介紹及快速入門

    MyBatis 簡單介紹及快速入門 簡單介紹 MyBatis是支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置