如何在Android中添加系统服务

本文介绍如何在Android系统中添加自定义系统服务。通过创建AIDL接口、实现服务类、注册服务并提供客户端调用的方法,实现了播放文本的服务示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:本次说的系统服务,是指捆绑在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.youkuaiyun.com/aiai373824745/article/details/7439896

 
 
 
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值