Android底層系統服務開發:以MediaRecorder模組為例
Android底層系統服務開發:以MediaRecorder模組為例
此範例是在Android裡添增了一個MediaRecorder的服務,讓Android的Java層應用軟體能呼叫MediaRecorder服務而進行錄音的工作。MediaRecorder服務的主要架構圖(由韓超先生所提供)如下:
圖 1
在Android裡已經有一個MediaPalyerService類別了。就是上圖1裡的:
圖 2
在這個MediaPalyerService類別裡添加一個內部(Inner)類別:MediaRecorderClient類別,如下圖:
圖 3
於是,這個擴充之後的MediaPalyerService類別就能提供錄音的服務了。為什麼這麼地簡單呢?因為他把錄音工作委託給幕後的OpenCodeAuthor,由它配合硬件來進行真正的錄音工作。如下圖:
圖 4
很多人會問到:既然有OpenCodeAuthor模組來進行錄音工作,為何還需要MediaPalyerService及其內含的MediaRecorderClient類別呢?
其原因是:MediaPalyerService及其內含的MediaRecorderClient類別才具有遠距(即跨進程的IPC溝通)服務的能力。為了進行遠距服務,所以MediaPalyerService原來就提供了IMediaPlayerService介面(內包IBinder標準IPC介面)來給遠距的組件使用。由於C++沒有Interface機制,所以使用繼承來實現介面之角色。
圖 5
上圖所敘述的IMediaPlayerService介面,是原來就有的,它提供播音的服務,但沒有錄音服務。因此,韓先生替MediaRecorderClient類別定義了IMediaRecorder介面,讓遠距的模組能透過此介面而使用MediaRecorderClient類別的錄音服務。如下圖:
圖 6
寫完了MediaRecorderClient類別,也提供了IMediaRecorder介面之後,系統層級(System-level)的錄音服務就算完成了。
此時,你很容易想到一個問題:Java層級的類別(如Activity或Service等)如何使用這個MediaRecorderClient類別服務呢? 於是,韓先生在撰寫一個mediarecorder類別(是C++類別),來遠距使用MediaRecorderClient類別的服務。
圖 7
然後,Java類別就能透過JNI介面來呼叫mediarecorder類別的函數,進而使用到MediaRecorderClient類別的服務了。其JNI介面如下圖:
圖 8
此時,你很可能會繼續問到:寫好了MediaRecorderClient類別的服務之後,何時(When)安裝到Android執行環境裡呢?其答案是:當Android進行其系統啟動過程時,會執行MediaPalyerService類別的Instantiate()函數,透過天字第一號服務(即ServiceManager)來將此MediaPalyerService服務登錄到Binder Driver裡,成為一項可被遠距綁定(bind)的系統服務。
一旦系統啟動完成了,MediaPalyerService服務也登錄完成了。就可以執行Java層級的應用類別了,例如Java層級的Activity類別就能透過JNI介面而要求VM(Virtual Machine)去載入(load)共享類別庫(*.SO)裡的mediarecorder類別,進而遠距使用到已登錄的MediaPalyerService服務了。◆
更多相关文章
- Android(安卓)渗透测试学习手册 第四章 对 Android(安卓)设备进
- 图解 Android(安卓)动画中 android:pivotX 和 android:pivotY 属
- Android(安卓)Studio 基础 之 如何取消使用 Android(安卓)X 的操
- 使用Panel和TextLine模拟Android的Toast
- Android学习手记:第一个应用程序!
- Android(安卓)Dialog使用举例
- Android:使用JDBC链接MySQL数据库
- Android中使用Handler机制更新UI的两种方法
- android --相机使用详解概述