android binder 處理序間通訊機制5-Service註冊和代理對象的擷取,android5-service

來源:互聯網
上載者:User

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的精簡版本
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.