android binder 處理序間通訊機制5-Service註冊和代理對象的擷取,android5-service
ServiceManager,其實也是一個Service,不過它的Server端實現並未使用Binder庫的結構實現,而是直接開啟binder/dev進行通訊的,不具有普遍性。
下面以MediaServer中的MediaPlayService為例,說明更加普遍的使用binder通訊機制的Service的實現。
一、Service組件的啟動
Service組件是在Server進程中啟動並執行,Server進程通常從其main函數啟動,啟動時通常做兩件事:
1.首先將它裡面的Service組件註冊到ServiceManager中
2.啟動一個Binder線程池來等待和處理Client進程的通訊請求。
以MediaServer及其中的MediaPlayService為例,其入口位置為:frameworks\av\media\mediaserver\Main_mediaserver.cpp中。
MeidaPlayService的部分結構圖如下:
其完整結構完全按照binder庫的結構實現。
其啟動過程如下:
中talkWithDriver調用中,使用ioctl與binder驅動程式進行互動,會將通訊資料封裝為一個binder_write_read結構體,使用BINDER_WRITE_READ協議通訊。
在Binder驅動程式內部使用binder_ioctl對所要處理的資料進行分發,最終通過binder_thread_read 和 binder_thread_write,將註冊請求告訴ServiceManager,並將處理結果再次經過Binder驅動返回MediaServer進程。
二、Service代理對象的擷取
Service代理對象的擷取過程為一個Client進程與ServiceManager進程標準的Binder通訊過程:
如下:
其中getService會調用checkService,IServiceManager的這真正實作類別為BpServiceManager,它是ServiceManager的代理對象。Client進程通過它,經由Binder驅動程式與ServiceManager所在的進程取得聯絡進行通訊。
android 怎讓兩個apk相互連信
A.apk,B.apk都是我寫的.現在我想在B.apk裡實現獲得A.apk的某控制項ID,並向其發送一個按鍵事件.如何?,謝謝!也就是用B控制A.
這兩個apk 是在兩個進程裡的,(或許可以配置成一個進程。不過如何直接操作這個沒有試過。)
所以一般的有兩種方法:
1、RPC
2、通過 BroadcastRecever 或 Service
第二種方法比較簡單一些。
比如B 控制 A的話,
A定義Service ,比如com.my.ServerA .自訂actionFilter “com.my.serverA.action"
B中調用Intent it = newIntent("com.my.serverA.action");
it.putExtra(....);// 傳遞你的自訂控制指令。
B.startService(it);
在A中ServerA的 onStartService(Intent it) 。解析這個控制指令,做相應操作就可以了。
用BroadcastRecever 的道理一樣。
Aidl,android平台的IPC方式之一,基於系統的Ibinder機制。
網上大多數例子都是在一個apk下來測試調用service,現在我在兩個project下面來調用。
一個是server project,一個是client project
首先我們建立的是server project,這裡面要實現aidl檔案和一個service,activity只是用來啟動service的,當然,你也可以通過發廣播的形式來啟動service。
首先看IAidlService.aidl檔案:
Java代碼
package com.ds.server;
interface IAidlService {
int getType();
}
這樣在eclipse裡面自動編譯的時候會在gen下面產生IAidlService.java檔案(燈下我們的client project要用)。
然後建立一個service,這個service裡面has a IAidlService的stub對象,service具體代碼如下:
Java代碼
package com.ds.server;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class AidlService extends Service {
private IAidlService.Stub mBinder = new IAidlService.Stub() {
@Override
public int getType() throws RemoteException {
// TODO Auto-generated method stub
return 5;
}
};
private void Log(String str) {
......餘下全文>>
最近在找android開發的工作,總結了有些面試題還是不會,希望大俠挨個解答一下
1 寫一個service,application 通過createservice
2 運行時一般是根據uid,檔案系統許可權跟linux一樣
3 可以,知道class名字 或者知道具體manifest怎麼寫的
4 looper是線程,迴圈來處理message queue的message,而handler對發送message的相關方法的一個類。
5 binder機制,pipe 不太清楚,socket是通過通訊端來發送內容進行ipc,binder的話 是用共用記憶體,servicemanager作為service的管理者
6 surfaceflinger 是對視窗進行管理,
7 bionic是glic的精簡版本