Android底層系統服務開發:以MediaRecorder模組為例

此範例是在Android裡添增了一個MediaRecorder的服務,讓Android的Java層應用軟體能呼叫MediaRecorder服務而進行錄音的工作。MediaRecorder服務的主要架構圖(由韓超先生所提供)如下:

clip_image001

圖 1

在Android裡已經有一個MediaPalyerService類別了。就是上圖1裡的:

clip_image002

圖 2

在這個MediaPalyerService類別裡添加一個內部(Inner)類別:MediaRecorderClient類別,如下圖:

clip_image003

圖 3

於是,這個擴充之後的MediaPalyerService類別就能提供錄音的服務了。為什麼這麼地簡單呢?因為他把錄音工作委託給幕後的OpenCodeAuthor,由它配合硬件來進行真正的錄音工作。如下圖:

clip_image004

圖 4

很多人會問到:既然有OpenCodeAuthor模組來進行錄音工作,為何還需要MediaPalyerService及其內含的MediaRecorderClient類別呢?

其原因是:MediaPalyerService及其內含的MediaRecorderClient類別才具有遠距(即跨進程的IPC溝通)服務的能力。為了進行遠距服務,所以MediaPalyerService原來就提供了IMediaPlayerService介面(內包IBinder標準IPC介面)來給遠距的組件使用。由於C++沒有Interface機制,所以使用繼承來實現介面之角色。

clip_image005

圖 5

上圖所敘述的IMediaPlayerService介面,是原來就有的,它提供播音的服務,但沒有錄音服務。因此,韓先生替MediaRecorderClient類別定義了IMediaRecorder介面,讓遠距的模組能透過此介面而使用MediaRecorderClient類別的錄音服務。如下圖:

clip_image006

圖 6

寫完了MediaRecorderClient類別,也提供了IMediaRecorder介面之後,系統層級(System-level)的錄音服務就算完成了。

此時,你很容易想到一個問題:Java層級的類別(如Activity或Service等)如何使用這個MediaRecorderClient類別服務呢? 於是,韓先生在撰寫一個mediarecorder類別(是C++類別),來遠距使用MediaRecorderClient類別的服務。

clip_image007

圖 7

然後,Java類別就能透過JNI介面來呼叫mediarecorder類別的函數,進而使用到MediaRecorderClient類別的服務了。其JNI介面如下圖:

clip_image008

圖 8

此時,你很可能會繼續問到:寫好了MediaRecorderClient類別的服務之後,何時(When)安裝到Android執行環境裡呢?其答案是:當Android進行其系統啟動過程時,會執行MediaPalyerService類別的Instantiate()函數,透過天字第一號服務(即ServiceManager)來將此MediaPalyerService服務登錄到Binder Driver裡,成為一項可被遠距綁定(bind)的系統服務。

一旦系統啟動完成了,MediaPalyerService服務也登錄完成了。就可以執行Java層級的應用類別了,例如Java層級的Activity類別就能透過JNI介面而要求VM(Virtual Machine)去載入(load)共享類別庫(*.SO)裡的mediarecorder類別,進而遠距使用到已登錄的MediaPalyerService服務了。◆

更多相关文章

  1. 工作环境搭建(9) - CentOS7命令行安装Android NDK
  2. 移植 android, touch screen 不能正常工作的问题
  3. Android Priority Job Queue:一个专门为Android轻松调度任务的工
  4. 源码解析Android中AsyncTask的工作原理
  5. 使用 Android Compatibility Package 来简化开发工作
  6. vs2010开发android的准备工作

随机推荐

  1. Apache Ranger:运维管理的神兵利器
  2. java实现电脑开关机
  3. Android(安卓)水波纹效果的探究
  4. 太火了!MyBatis Plus 为啥这么牛?
  5. HBase 底层原理详解(深度好文,建议收藏)
  6. 循环结构的继续学习
  7. 工作中常用到的Linux命令
  8. 太简单了!PHP获取文件扩展名的7中方法
  9. php中使用fsockopen实现异步请求(代码示例
  10. php实现将表单内容提交到数据库