一,在frameworks/base/core/java/android/content/Context.java中新增
public static final String RADIO_SERVICE = "radioservice"(自己定義的);
二,在frameworks/base/core/java/com/auto/radioservice檔案中新增IRadioPlayer.aidl
三,在framework/base/Android.mk中新增LOCAL_SRC_FILES中新增一行
core/java/com/auto/radioservice/IRadioPlay.aidl
四,在framework/base/services/java/com/auto中新增自己的服務
比喻 新建檔案radioservice,在檔案下RadioService.java.
並繼承aidl生成的檔案 public class RadioService extends IRadioPlayer.Stub
五,在framework/base/services/java/com/android/server/SystemServer.java中新增
RadioService radioService = null;
private void registerHCNService(Context context){
Slog.i(TAG, "RadioService");
radioService = RadioService.getInstance();
if(!radioService.init()){
Slog.e(TAG, "RadioService init failed");
}
ServiceManager.addService(Context.RADIO_SERVICE, radioService);
}
在startOtherServices(){
.
.
.
registerHCNService(context);
}
六,在/home/mxy/code/v1/frameworks/base/core/java/com/autohcn/auto中建立IRadioManager,RadioManager
用於管理RadioService
說明:本次說的系統服務,是指捆綁在system_process程序中的服務。
仔細閱讀原始碼可以發現,在frameworks/base/services/java/com/android/server/SystemServer.java中添加了很多服務,什麼熵資訊、電量、wife等等服務,這些服務啟動都在launcher之前,一般要繼承Binder或者繼承一個AIDL。下面試著來新增一個簡單系統服務
一。在frameworks/base/core/java/android/os/ 增加一個aidl檔案,最後用aidl工具生產一個Java檔案,這樣可以方便後面:
- package android.os;
- /**
- * Interface that allows controlling and querying YtTts connectivity.
- *
- * {@hide}
- */
- interface IYtTtsService{
- /**
- * 播放Text文字
- */
- int speak(String text);
- }
然後在修改/frameworks/base/Android.mk,在LOCAL_SRC_FILES裡新增一行:core/java/android/os/IYtTtsService.aidl \
不確定補充:把AIDL檔案寫在這個地方似乎可以避免加@hide
二 。在frameworks/base/services/java/com/android/server/ 新建要增加的service,繼承上面aidl生產的java:
- package com.android.server;
- import android.content.Context;
- import android.os.IYtTtsService;
- import android.os.RemoteException;
- import android.util.Log;
- public class YtTtsService extends IYtTtsService.Stub {
- private WorkerThread mWorker;
- public YtTtsService(Context context) {
- super();
- mWorker = new WorkerThread("YtTtsServiceWorker");
- mWorker.start();
- Log.i("[YT]", "In YtTtsService-->"+context);
- }
- @Override
- public int speak(String text) throws RemoteException {
- Log.i("[YT]", "In YtTtsService-->"+text);
- return 0;
- }
- private class WorkerThread extends Thread{
- int i = 0;
- public WorkerThread(String name) {
- super(name);
- }
- public void run() {
- while(true){
- i++;
- Log.i("[YT]", "In YtTtsService-->WorkerThread running "+i);
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
三。在frameworks/base/services/java/com/android/server/SystemServer.java, ServerThread中run()方法中增加程式碼:
- try {
- Log.i("[YT]", "In SystemServer, YtTts add..");
- ServiceManager.addService("yttts", new YtTtsService(context));
- } catch (Throwable e) {
- Log.i("[YT]", "In SystemServer, YtTts add err..");
- }
5.在/frameworks/base/core/java/cn/youngtone/tts建一個YtTtsManager類,用於管理YtTtsService:
- package cn.youngtone.tts;
- import android.content.Context;
- import android.os.IYtTtsService;
- import android.os.RemoteException;
- import android.util.Log;
- public class YtTtsManager {
- IYtTtsService service;
- public YtTtsManager(Context context ,IYtTtsService service) {
- this.service = service;
- }
- public void speak(String text) {
- try {
- Log.e("[YT]" , "In YtTtsManage-->speak():"+text);
- service.speak(text);
- } catch (RemoteException e) {
- Log.e("[YT]" , "In YtTtsManage-->E:RemoteException");
- e.printStackTrace();
- }
- }
- }
四。 在ContextImpl getSystemService中新增程式碼:
- if ("yttts".equals(name)) {
- if (mYtTtsManager == null) {
- IBinder b = ServiceManager.getService("yttts");
- IYtTtsService service = IYtTtsService.Stub.asInterface(b);
- mYtTtsManager = new YtTtsManager(this, service);
- }
- return mYtTtsManager;
- }
五。測試程式碼
- YtTtsManager mManager = (YtTtsManager)getSystemService("yttts");
- mManager.speak("這是一個簡單的系統服務!");
END.
參考:http://blog.csdn.net/aiai373824745/article/details/7439896