如何在Android中添加系統服務

說明:本次說的系統服務,是指捆綁在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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章