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:
- package com.example.double2.myaidltest;
- interface myAIDL {
- void testMethod();
- }
建立AIDL檔案與建立java檔案等類似,直接右擊建立即可。android studio中就十分方便,會自動在main檔案下建立一個aidl資料夾,並在該資料夾創建於你專案名相同的包名。
可能遇到的小問題:
筆者第一次建立AIDL,在Service中發現找不到該AIDL的包。遇到相同問題的讀者可以在建立AIDL並寫完抽象方法之後使用build->make project重新構建一下專案。
2、建立一個遠端Service,在Service中建立一個類繼承AIDL介面中的Stub類並實現Stub中的抽象方法,最後不要忘記在onBind中返回這個類的物件。
- publicclass AIDLRemoteService extends Service {
- privatestaticfinal String TAG = "AIDLRemoteService";
- privatefinal myAIDL.Stub mBinder=new myAIDL.Stub(){
- @Override
- publicvoid testMethod() throws RemoteException {
- Log.d(TAG, "testMethod: "+"this is myAIDLTest");
- }
- };
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
- }
3、在要呼叫的地方(筆者demo中就為MainActivity中)繫結該Service,將Service返回的Binder物件轉換成AIDL介面所屬的型別,接著直接呼叫AIDL的方法。
在成功連線之後,將Service返回的Binder物件轉換成AIDL介面所屬的型別:
- private myAIDL mMyAIDL;
- private ServiceConnection mServiceConnection = new ServiceConnection() {
- @Override
- publicvoid onServiceConnected(ComponentName name, IBinder service) {
- Log.e(TAG, "onServiceConnected");
- mMyAIDL = myAIDL.Stub.asInterface(service);
- }
- @Override
- publicvoid onServiceDisconnected(ComponentName name) {
- Log.e(TAG, "onServiceDisconnected");
- mMyAIDL = null;
- }
- };
在呼叫處直接使用:
- btnStartMethod.setOnClickListener(new View.OnClickListener() {
- @Override
- publicvoid onClick(View v) {
- try {
- mMyAIDL.testMethod();
- } catch (RemoteException e) {
- Toast.makeText(MainActivity.this, "服務被異常殺死,請重新開啟。", Toast.LENGTH_SHORT).show();
- }
- }
- });
demo專案結構:
myAIDL.aidl:
- package com.example.double2.myaidltest;
- interface myAIDL {
- void testMethod();
- }
- package com.example.double2.myaidltest;
- import android.app.Service;
- import android.content.Intent;
- import android.os.IBinder;
- import android.os.RemoteException;
- import android.util.Log;
- /**
- * 專案名稱:MyAIDLTest
- * 建立人:Double2號
- * 建立時間:2016/6/10 8:13
- * 修改備註:
- */
- publicclass AIDLRemoteService extends Service {
- privatestaticfinal String TAG = "AIDLRemoteService";
- privatefinal myAIDL.Stub mBinder=new myAIDL.Stub(){
- @Override
- publicvoid testMethod() throws RemoteException {
- Log.d(TAG, "testMethod: "+"this is myAIDLTest");
- }
- };
- @Override
- public IBinder onBind(Intent intent) {
-
相關推薦
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或註解用於配置