編輯:Android開發實例
AIDL:Android Interface Definition Language,它是一種android內部進程通信接口的描述語言,通過它我們可以定義進程間的通信接口。
ICP:Interprocess Communication ,內部進程通信。
使用:
1、先創建一個aidl文件,aidl文件的定義和java代碼類似,但是!它可以引用其它aidl文件中定義的接口和類,但是不能引用自定義的java類文件中定義的接口和類,要引用自定義的接口或類,需要為此類也定義一個對應的aidl文件,並且此類要實現Parcelable接口,同時aidl文件和類文件必須要在相同包下進行聲明;Android包含了aidl編譯器,當定義好一個aidl文件的時候,會自動編譯生成一個java文件,此文件保存在gen目錄之下。
在這個項目中,定義了兩個aidl文件,其中Person實現了接口Parcelable,下面是這兩個aidl文件的定義:
- Person.aidl
- {
- parcelable Person;
- }
- IAIDLServerService.aidl
- {
- package com.webview;
- import com.webview.Person;// 引用上面的Person.aidl
- interface IAIDLServerService{
- String sayHello();
- Person getPerson();
- }
- }
2、編寫一個Service實現定義aidl接口中的內部抽象類Stub,Stub繼承自Binder,並繼承我們在aidl文件中定義的接口,我們需要實現這些方法。Stub中文意思存根,Stub對象是在服務端進程中被調用,即服務端進程。
在客戶端調用服務端定義的aidl接口對象,實現Service.onBind(Intent)方法,該方法會返回一個IBinder對象到客戶端,綁定服務時需要一個ServiceConnection對象,此對象其實就是用來在客戶端綁定Service時接收Service返回的IBinder對象。
- public static abstract class Stub extends android.os.Binder implements com.webview.IAIDLServerService
- public class AIDLServerService extends Service{
- @Override
- public IBinder onBind(Intent intent) {
- return binder;
- }
- private IAIDLServerService.Stub binder = new Stub() {
- @Override
- public String sayHello() throws RemoteException {
- return "Hello AIDL";
- }
- @Override
- public Person getPerson() throws RemoteException {
- Person person = new Person();
- person.setName("Livingstone");
- person.setAge(22);
- return person;
- }
- };
- }
3、在服務端注冊Service,將如下代碼添加進Application節點之下!
- <service android:name="com.webview.AIDLServerService"
- android:process=":remote">
- <intent-filter>
- <action android:name="com.webview.IAIDLServerService"></action>
- </intent-filter>
- </service>
至此,服務端進程定義已經完成!
4、編寫客戶端,注意需要在客戶端存一個服務端實現了的aidl接口描述文件,客戶端只是使用該aidl接口,獲取服務端的aidl對象
(IAIDLServerService.Stub.asInterface(service))之後就可以調用接口的相關方法,而對象的方法的調用不是在客戶端執行,而是在服務端執行。
- public class MainActivity extends Activity {
- private Button btn;
- private IAIDLServerService aidlService = null;
- private ServiceConnection conn = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- aidlService = null;
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- aidlService = IAIDLServerService.Stub.asInterface(service);
- try {
- aidlService.doFunction();// 執行接口定義的相關方法
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btn = (Button) findViewById(R.id.button);
- tv = (TextView) findViewById(R.id.textview);
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent service = new Intent("com.webview.IAIDLServerService");
- bindService(service, conn, BIND_AUTO_CREATE);// 綁定服務
- }
- });
- }
- }
客戶端目錄結構:
轉自:http://www.cnblogs.com/a284628487/archive/2013/04/16/3024983.html
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
在Android中,視圖控件大致被分為兩類,即ViewGroup和View,ViewGroup控件作為父控件,包含並管理著子View,通過ViewGroup和Vi
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
南丁格爾玫瑰圖 在常規圖表中實在很驚艷,但我初看沒看懂,一查原來南丁格爾這麼偉大,確實值得尊敬。 再仔細研究了下這種圖的構成,發現原來就是把柱形圖的柱形換成了扇形