一,在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文件,这样可以方便后面:

  1. package android.os;
  1. /**
  2. * Interface that allows controlling and querying YtTts connectivity.
  3. *
  4. * {@hide}
  5. */
  6. interface IYtTtsService{
  7. /**
  8. * 播放Text文字
  9. */
  10. int speak(String text);
  11. }

然后在修改/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:

  1. package com.android.server;
  2. import android.content.Context;
  3. import android.os.IYtTtsService;
  4. import android.os.RemoteException;
  5. import android.util.Log;
  1. public class YtTtsService  extends IYtTtsService.Stub {
  2. private WorkerThread mWorker;
  3. public YtTtsService(Context context) {
  4. super();
  5. mWorker = new WorkerThread("YtTtsServiceWorker");
  6. mWorker.start();
  7. Log.i("[YT]", "In YtTtsService-->"+context);
  8. }
  9. @Override
  10. public int speak(String text) throws RemoteException {
  11. Log.i("[YT]", "In YtTtsService-->"+text);
  12. return 0;
  13. }
  14. private class WorkerThread extends Thread{
  15. int i = 0;
  16. public WorkerThread(String name) {
  17. super(name);
  18. }
  19. public void run() {
  20. while(true){
  21. i++;
  22. Log.i("[YT]", "In YtTtsService-->WorkerThread running "+i);
  23. try {
  24. Thread.sleep(3000);
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30. }
  31. }

三。在frameworks/base/services/java/com/android/server/SystemServer.java, ServerThread中run()方法中增加代码:

  1. try {
  2. Log.i("[YT]", "In SystemServer, YtTts add..");
  3. ServiceManager.addService("yttts", new YtTtsService(context));
  4. } catch (Throwable e) {
  5. Log.i("[YT]", "In SystemServer, YtTts add err..");
  6. }

5.在/frameworks/base/core/java/cn/youngtone/tts建一个YtTtsManager类,用于管理YtTtsService:

  1. package cn.youngtone.tts;
  2. import android.content.Context;
  3. import android.os.IYtTtsService;
  4. import android.os.RemoteException;
  5. import android.util.Log;
  6. public class YtTtsManager {
  7. IYtTtsService service;
  8. public YtTtsManager(Context context ,IYtTtsService service) {
  9. this.service = service;
  10. }
  11. public void speak(String text) {
  12. try {
  13. Log.e("[YT]" , "In YtTtsManage-->speak():"+text);
  14. service.speak(text);
  15. } catch (RemoteException e) {
  16. Log.e("[YT]" , "In YtTtsManage-->E:RemoteException");
  17. e.printStackTrace();
  18. }
  19. }
  20. }

四。 在ContextImpl getSystemService中添加代码:

  1. if ("yttts".equals(name)) {
  1. if (mYtTtsManager == null) {
  2. IBinder b = ServiceManager.getService("yttts");
  3. IYtTtsService service = IYtTtsService.Stub.asInterface(b);
  4. mYtTtsManager = new YtTtsManager(this, service);
  5. }
  6. return mYtTtsManager;
  7. }

五。测试代码

  1. YtTtsManager mManager = (YtTtsManager)getSystemService("yttts");
  2. mManager.speak("这是一个简单的系统服务!");

END.

参考:http://blog.csdn.net/aiai373824745/article/details/7439896

如何在Android中添加系统服务的更多相关文章

  1. 如何在Android中使用OpenCV

    如何在Android中使用OpenCV 2011-09-21 10:22:35 标签:Android 移动开发 JNI OpenCV NDK 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...

  2. Android DevArt5:如何在Android中创建多线程?

    本篇内容: 如何在Android中创建多进程?查看进程的三种方式有哪些? 多进程模式的运行机制?- 演示了多进程出现问题中的两种情况: 静态成员失效 Application多次创建 IPC基础概念介绍 ...

  3. android中添加只有border-left的样式

    如何在android中的边框添加只有左边边框有颜色的样式呢 1. 相应的drawable文件 <?xml version="1.0" encoding="utf-8 ...

  4. 如何在Eclipse中添加Tomcat的jar包

    原文:如何在Eclipse中添加Tomcat的jar包 右键项目工程,点击Java Build Path 点击Add Library,选择Server Runtime 选择Tomcat版本 此时就看到 ...

  5. 【原创】如何在Android中为TextView动态设置drawableLeft等

    如何在Android中为TextView动态设置drawableLeft等   两种方式:   方式1:手动设置固有边界 Drawable drawable = getResources().getD ...

  6. 如何在Eclipse中添加Servlet-api.jar的方法

    方法一: 点击窗口->首选项->java->构建路径->类路径变量->新建:将你的tomcat目录下的common/lib/servlet.jar加进来.如果你建立了一个 ...

  7. 如何在niosII中添加i2c外设_winday_新浪博客

    如何在niosII中添加i2c外设_winday_新浪博客 如何在niosII中添加i2c外设 winday 摘要:本文说明了如何在niosII添加第三方i2c外设,以供参考. 由于本人使用的Alte ...

  8. Android中添加自己的模块 【转】

    本文转载自:http://wallage.blog.163.com/blog/static/17389624201021791333695/ 转:http://blog.csdn.net/yili_x ...

  9. Oracle 12c 多租户家族(12c 18c 19c)如何在 PDB 中添加 HR 模式

    Oracle 12c 多租户家族(12c [12.2.0.1].18c [12.2.0.2].19c [12.2.0.3])如何在 PDB 中添加模式:19c (19.3) 手工添加示例 HR 用户 ...

随机推荐

  1. word转pdf swf 在线预览

    来源:http://www.cnblogs.com/wuhenke/archive/2010/08/01/1789750.html 之前在项目中研究使用了一套word转PDF,然后将PDF转成SWF的 ...

  2. 指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效

    以下内容来自互联网 (1)web: 需要在客户端配置文件的中增加connectionString节点,此节点描述了EntityClient的连接信息. 例如: 在web.config的中增加conne ...

  3. 在Linux系统如何让程序开机时自动启动

    在Linux系统如何让程序开机时自动启动      核心提示:系统的服务在开机时一般都可以自动启动,那在linux系统下如果想要程序在开机时自动启动怎么办?我们知道在 windows系统“开始”--& ...

  4. vi 使用教程

    编辑一个文本文件是经常使用到的计算机操作.我们想做的大多数事情都需要使用某种文件编辑.文本编辑器会方便文件的创建和修改.编辑一个文本文件是经常使用到的计算机操作.我们想做的大多数事情都需要使用某种文件 ...

  5. 12.04 ubuntu 更改IP

    在一个局域网里面,如果是自动获取IP,就会导致IP冲突 进入要连接的热点进行设置 IPV4 Setting address                     netmask           ...

  6. SQL查询表,表的所有字段名,SQL查询表,表的所有字段名

    SQL查询表,表的所有字段名 2011-07-29 10:21:43|  分类: SQLServer |  标签:表  sql  字段   |举报 |字号 订阅   SQL查询表,表的所有字段名 SQ ...

  7. 【A + B + C + D】 问题

    A + B + C + D Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. ==与equals()方法的不同

    ==比较分为两种情况:基本数据类型比较与引用数据类型比较 1.基本数据类型,根据基本数据类型的值是否相等来判断,相等则返回true,不相等则返回false.两端数据类型可以不同,如果转换后的数值相等, ...

  9. couldn't connect to server 127.0.0.1:27017 at src/mongo/shell/mongo.js:145

    当直接执行./mongo 出现这样的提示:couldn't connect to server 127.0.0.1:27017 at src/mongo/shell/mongo.js:145 解决: ...

  10. Windows下将ImageMagick移植到Android平台

    Windows下将ImageMagick移植到Android平台 原文链接  http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ I ...