關於AIDL的使用---- Android 進程間通訊之一

關於AIDL的使用---- Android 進程間通訊之一

AIDL AndroidInterface Definition Language,Android接口定義語言

由於進程間不能共享內存,因此,需要提供一些機制在不同進程之間進行數據通信。

其中AIDL是方法之一,一般都是配合service來進行跨進程通訊,單獨AIDL無法通信。

 

關於AIDL的使用,一般分爲serverclient端。

Server的實現步驟如下

1, server端生成一個以”.aidl”結尾的文件,定義接口,如下:



接口內容如下:

package com.example.server;

interface IRemoteService {
    int getPid();
   
}

 2, 編譯完成後會在gen目錄下生成一個同樣目錄的文件,文件名爲IRemoteService.java, 如下:

 

3, 定義一個service TAService, 實現 IRemoteService裏的接口

package com.example.server;

import com.example.server.IRemoteService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Process;
import android.util.Log;
 
public class TAService extends Service {
	private static String TAG = "AIDLServer";
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG," onCreate........" + "Thread: " + Thread.currentThread().getName());
    }
    @Override
    public IBinder onBind(Intent arg0) {
    	Log.i(TAG,"DDService onBind");
        return mBinder;
    }
 
    private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
        public int getPid(){
        	Log.i(TAG,"Thread: " + Thread.currentThread().getName());
        	Log.i(TAG," getPid ");
            return Process.myPid();
        }
       
    };
 
}


4, 然後需要在server app 的AndroidManifest.xml 裏面聲明對應的service

      <service
            android:name="com.example.server.TAService"
            android:enabled="true"   
            android:exported="true"   >   
        </service>  


Client 端實現步驟如下:

 5, 定義一個和server端同一目錄的aidl文件

文件內容必須和server端的 文件內容一模一樣,包括參數名稱

package com.example.server;

interface IRemoteService {
    int getPid();
   
}

6, 在對應調用TAService的activity中定義ServiceConnection,實現對應接口,代碼如下:

 

ServiceConnection conn = new ServiceConnection() {
        
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
         
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            remoteService = IRemoteService.Stub.asInterface(service);
            try {
                int pid = remoteService.getPid();
                int currentPid = Process.myPid();
                Log.i(TAG,"currentPID: " + currentPid +"  remotePID: " + pid);
            } catch (RemoteException e) {
                e.printStackTrace();
                Log.i(TAG,"RemoteException");
            }
            Log.i(TAG,"bind success! " + remoteService.toString());
        }
    };
    

7, 綁定Server端的TAService,代碼如下:

			Intent intent = new Intent();
				ComponentName comp = new ComponentName("com.example.server",
						"com.example.server.TAService");

				intent.setComponent(comp);
				
		        bindService(intent, conn, Context.BIND_AUTO_CREATE);



完成上述步驟以後即可在conn 的回調中執行aidl接口

 執行client代碼之前首先要執行server端apk,保證TAService已經跑起來,否則client端綁定失敗, conn的兩個回調函數都跑不起來。

 由此可見, AIDL支持跨進程間接口調用,不支持靜態數據讀取。

 

 

demo 代碼下載地址如下:

http://download.csdn.net/detail/kuanxu/9572698

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章