如何在Android中添加系统服务

转载 2016年05月30日 16:51:30

说明:本次说的系统服务,是指捆绑在system_process进程中的服务。

  仔细阅读源码可以发现,在frameworks/base/services/java/com/Android/server/SystemServer.java中添加了很多服务,什么熵信息、电量、wife等等服务,这些服务启动都在launcher之前,一般要继承Binder或者继承一个AIDL。下面试着来添加一个简单系统服务

一。在frameworks/base/core/java/android/os/ 增加一个aidl文件,最后用aidl工具生产一个Java文件,这样可以方便后面:

[html] view plain copy
  1. package android.os;  
[html] view plain copy
  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:

[html] view plain copy
  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;  
[html] view plain copy
  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()方法中增加代码:
[html] view plain copy
  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
[html] view plain copy
  1. package cn.youngtone.tts;  
  2.   
  3. import android.content.Context;  
  4. import android.os.IYtTtsService;  
  5. import android.os.RemoteException;  
  6. import android.util.Log;  
  7.   
  8. public class YtTtsManager {  
  9.     IYtTtsService service;    
  10.       
  11.     public YtTtsManager(Context context ,IYtTtsService service) {    
  12.          this.service = service;    
  13.     }    
  14.     public void speak(String text) {    
  15.         try {  
  16.             Log.e("[YT]" , "In YtTtsManage-->speak():"+text);   
  17.             service.speak(text);  
  18.         } catch (RemoteException e) {    
  19.             Log.e("[YT]" , "In YtTtsManage-->E:RemoteException");    
  20.             e.printStackTrace();    
  21.         }    
  22.     }    
  23. }  

四。 在ContextImpl getSystemService中添加代码:

[java] view plain copy
  1. if ("yttts".equals(name)) {   
[java] view plain copy
  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. }  


五。测试代码

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

android framework添加系统服务

http://blog.csdn.net/pierce0young/article/details/24424991 在android源码中添加系统服务,如在android.app包下增加DevIn...
  • Arlen6310
  • Arlen6310
  • 2016年12月14日 14:09
  • 498

如何在android 4.0.3中添加系统服务

参考实作:http://blog.csdn.net/belyxiong/article/details/5875993  为android添加底层核心服务 参考博文中信息不全且有小小问题,本文对整个...
  • sinkary
  • sinkary
  • 2012年04月28日 18:09
  • 1776

在android framework中添加自定义系统服务

添加系统服务需要添加aidl,service,manager文件,需要修改SystemServer,Context,ContextImpl 下面举例进行说明,主要添加一个服务,用于获取系统时间和...
  • sgzy001
  • sgzy001
  • 2017年01月11日 16:20
  • 2344

android framework 添加系统服务

前言 本文的方法要修改Android源码。我们自定义一个自己的服务,并将其添加到ServiceManager中。步骤 1. 添加一个aidl文件,我将aidl文件添加到这个路径下: framew...
  • u011479494
  • u011479494
  • 2016年12月27日 16:52
  • 1259

android—如何添加一个系统服务

c中添加service java添加service前面分析过binder的实现流程,binder的实现包含了java和c++两部分,那么应该如何去添加一个service? c++中添加service...
  • lewif
  • lewif
  • 2016年02月18日 17:33
  • 2140

为android开放类增加自定义成员方法

android SDK中有些JAVA类是开放的,有些是不开放的,API同样如此。这里所谓开放的类或API,只是javadoc的范畴,并不是java中public和private,也就是说,对于源码的编...
  • yyyyyyyyyywwwwwwwwww
  • yyyyyyyyyywwwwwwwwww
  • 2015年05月05日 09:35
  • 285

亲测可用Android原生代码添加系统服务

在Android系统中,为我们提供了很多的系统服务,比如AMS,PMS等,今天参考系统里其他服务的实现,在Android N原生代码中添加自己定制的服务,想想都满激动的 准备工作在正式开始之前,需要知...
  • mockingbirds
  • mockingbirds
  • 2017年01月12日 21:55
  • 3407

Android源码添加自定义系统服务

本文以一个简单的例子详细介绍如何为Android 6.0 系统新增一个系统服务,以及如何使用自定义系统服务。 目标:1.创建一个自定义服务CCCService         2.APP 开发过程...
  • djwmzyl
  • djwmzyl
  • 2016年11月23日 16:21
  • 676

定制Android系统开发之九——在系统服务中实现回调

在上一篇博文里,我已经实现了从JNI到Java系统服务的回调。数据已经传回到java里了,那么下面的问题就是如何将数据传回到APP端。这篇博文将解决这个问题。...
  • wtianok
  • wtianok
  • 2016年01月04日 16:28
  • 1359

Android自定义系统服务与部分系统服务列表

Android系统服务的目录结构 1.系统服务的撰写: ·定义一个服务接口aidl文件:framework/base/core/java/android/os/ ·注册aidl文件f...
  • u013360656
  • u013360656
  • 2015年04月26日 14:50
  • 604
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在Android中添加系统服务
举报原因:
原因补充:

(最多只允许输入30个字)