AIDL

1、為什么要有AIDL?

香港彩票透码 www.kptln.icu 無論學什么東西,最先得弄明白為什么要有這個東西,不要說存在即是合理,存在肯定合理,但是你還是沒有明白。對于AIDL有一些人的淺顯概念就是,AIDL可以跨進程訪問其他應用程序,和其他應用程序通訊,那我告訴你,很多技術都可以訪問,如廣播(應用A在AndroidManifest.xml中注冊指定Action的廣播)應用B發送指定Action的廣播,A就能收到信息,這樣也能看成不同應用之間完成了通訊(但是這種通訊是單向的);還如ContentProvider,通過URI接口暴露數據給其他應用訪問;但是這種都算不上是應用之間的通訊??贍蘢釗萌嗣曰蟮氖茿ndroid推出來了Messager,它就是完成應用之間的通訊的。那么為什么還要有AIDL呢,官方文檔介紹AIDL中有這么一句話:

Note: Using AIDL is necessary only if you allow clients from different applications to access your service for IPC and want to handle multithreading in your service. If you do not need to perform concurrent IPC across different applications, you should create your interface by implementing a Binder or, if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger. Regardless, be sure that you understand Bound Services before implementing an AIDL.

第一句最重要,“只有當你允許來自不同的客戶端訪問你的服務并且需要處理多線程問題時你才必須使用AIDL”,其他情況下你都可以選擇其他方法,如使用Messager,也能跨進程通訊??杉鸄IDL是處理多線程、多客戶端并發訪問的。而Messager是單線程處理?;故槍俜轎牡鄧檔拿靼?,一句話就可以理解為什么要有AIDL。那么是不是這樣的寫個AIDL試試。

2、AIDL使用

第一、定義AIDL文件

[java] view plain copy print?

  1. // IRemoteService.aidl  

  2. package com.example.android;  

  3.   

  4. // Declare any non-default types here with import statements  

  5.   

  6. /** Example service interface */  

  7. interface IRemoteService {  

  8.     /** Request the process ID of this service, to do evil things with it. */  

  9.     int getPid();  

  10.   

  11.     /** Demonstrates some basic types that you can use as parameters 

  12.      * and return values in AIDL. 

  13.      */  

  14.     void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,  

  15.             double aDouble, String aString);  

  16. }  

這段代碼也是官方文檔的。命名為IRemoteService.aidl,放在com.example.android包下(這個可以隨意),保存后Android編譯器會在gen目錄下自動生成IRemoteService.java文件 第二、定義我們的服務,DDService.java,并且需要在AndroidManifest.xml中注冊,并添加“duanqing.test.aidl” 的ACTION

[java] view plain copy print?

  1. package com.example.service;  

  2.   

  3. import com.example.android.IRemoteService;  

  4.   

  5. import android.app.Service;  

  6. import android.content.Intent;  

  7. import android.os.IBinder;  

  8. import android.os.Process;  

  9.   

  10. public class DDService extends Service {  

  11.     @Override  

  12.     public void onCreate() {  

  13.         super.onCreate();  

  14.         System.out.println("DDService onCreate........" + "Thread: " + Thread.currentThread().getName());  

  15.     }  

  16.     @Override  

  17.     public IBinder onBind(Intent arg0) {  

  18.         System.out.println("DDService onBind");  

  19.         return mBinder;  

  20.     }  

  21.   

  22.     private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {  

  23.         public int getPid(){  

  24.             System.out.println("Thread: " + Thread.currentThread().getName());  

  25.             System.out.println("DDService getPid ");  

  26.             return Process.myPid();  

  27.         }  

  28.         public void basicTypes(int anInt, long aLong, boolean aBoolean,  

  29.             float aFloat, double aDouble, String aString) {  

  30.             System.out.println("Thread: " + Thread.currentThread().getName());  

  31.             System.out.println("basicTypes aDouble: " + aDouble +" anInt: " + anInt+" aBoolean " + aBoolean+" aString " + aString);  

  32.         }  

  33.     };  

  34.   

  35. }  


這樣我們的服務端就完成了,把服務端運行到模擬器(或者手機上),等一會可以看一下打印信息,重點看“線程名” 
第三、實現客戶端測試代碼 新建另一個工程,同樣需要添加AIDL協議文件(這是一個標準的協議文件,定義對外服務),這里我列出來我的測試代碼:

[java] view plain copy print?

  1. package com.example.aidlclient;  

  2.   

  3. import android.app.Activity;  

  4. import android.content.ComponentName;  

  5. import android.content.Context;  

  6. import android.content.Intent;  

  7. import android.content.ServiceConnection;  

  8. import android.os.Bundle;  

  9. import android.os.IBinder;  

  10. import android.os.Process;  

  11. import android.os.RemoteException;  

  12. import android.view.View;  

  13.   

  14. import com.example.android.IRemoteService;  

  15.   

  16. public class MainActivity extends Activity {  

  17.     private IRemoteService remoteService;  

  18.     @Override  

  19.     public void onCreate(Bundle savedInstanceState) {  

  20.         super.onCreate(savedInstanceState);  

  21.         setContentView(R.layout.activity_main);  

  22.     }  

  23.       

  24.     ServiceConnection conn = new ServiceConnection() {  

  25.           

  26.         @Override  

  27.         public void onServiceDisconnected(ComponentName name) {  

  28.         }  

  29.           

  30.         @Override  

  31.         public void onServiceConnected(ComponentName name, IBinder service) {  

  32.             remoteService = IRemoteService.Stub.asInterface(service);  

  33.             try {  

  34.                 int pid = remoteService.getPid();  

  35.                 int currentPid = Process.myPid();  

  36.                 System.out.println("currentPID: " + currentPid +"  remotePID: " + pid);  

  37.                 remoteService.basicTypes(121223true12.2f, 12.3"我們的愛,我明白");  

  38.             } catch (RemoteException e) {  

  39.                 e.printStackTrace();  

  40.             }  

  41.             System.out.println("bind success! " + remoteService.toString());  

  42.         }  

  43.     };  

  44.           

  45.     /** 

  46.      * 監聽按鈕點擊 

  47.      * @param view 

  48.      */  

  49.     public void buttonClick(View view) {  

  50.         System.out.println("begin bindService");  

  51.         Intent intent = new Intent("duanqing.test.aidl");  

  52.         bindService(intent, conn, Context.BIND_AUTO_CREATE);  

  53.     }  

  54.   

  55.     @Override  

  56.     protected void onDestroy() {  

  57.         super.onDestroy();  

  58.         unbindService(conn);  

  59.     }  

  60. }  

4、執行 點擊客戶端按鈕,執行,看打印信息:
看服務端打印,DDService onCreate..........Thread: main,主線程,當客戶端調用服務端getPid方法時,服務端是在Thread: Binder2中執行,當客戶端調用服務端basicType方法時,服務端是在Thread:Binder1中執行

來源:CSDN

上一篇: Android校招復習資料整理

下一篇: 為開發者準備的最佳 Android 函數庫(2016 年版)

分享到: 更多
复式6码二中二三中三多少组 打鱼输的倾家荡产 河北时时开奖结果查询 今晚买什么生肖最准包中 重庆时时是不是骗局 赌场龙虎可以作弊吗 欢乐生肖开奖网址 二星包胆中奖率高 云南时时几点开奖时间 开户送38体验金不限id娱乐 七星彩专家杀号最准确 时时彩计划 飞艇中5码诀窍 北京pk拾稳赚技巧公式 不再赌ag了 北京pk10稳赚技巧