如何在Android中添加系统服务
一,在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
如何在Android中添加系统服务的更多相关文章
- 如何在Android中使用OpenCV
如何在Android中使用OpenCV 2011-09-21 10:22:35 标签:Android 移动开发 JNI OpenCV NDK 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...
- Android DevArt5:如何在Android中创建多线程?
本篇内容: 如何在Android中创建多进程?查看进程的三种方式有哪些? 多进程模式的运行机制?- 演示了多进程出现问题中的两种情况: 静态成员失效 Application多次创建 IPC基础概念介绍 ...
- android中添加只有border-left的样式
如何在android中的边框添加只有左边边框有颜色的样式呢 1. 相应的drawable文件 <?xml version="1.0" encoding="utf-8 ...
- 如何在Eclipse中添加Tomcat的jar包
原文:如何在Eclipse中添加Tomcat的jar包 右键项目工程,点击Java Build Path 点击Add Library,选择Server Runtime 选择Tomcat版本 此时就看到 ...
- 【原创】如何在Android中为TextView动态设置drawableLeft等
如何在Android中为TextView动态设置drawableLeft等 两种方式: 方式1:手动设置固有边界 Drawable drawable = getResources().getD ...
- 如何在Eclipse中添加Servlet-api.jar的方法
方法一: 点击窗口->首选项->java->构建路径->类路径变量->新建:将你的tomcat目录下的common/lib/servlet.jar加进来.如果你建立了一个 ...
- 如何在niosII中添加i2c外设_winday_新浪博客
如何在niosII中添加i2c外设_winday_新浪博客 如何在niosII中添加i2c外设 winday 摘要:本文说明了如何在niosII添加第三方i2c外设,以供参考. 由于本人使用的Alte ...
- Android中添加自己的模块 【转】
本文转载自:http://wallage.blog.163.com/blog/static/17389624201021791333695/ 转:http://blog.csdn.net/yili_x ...
- 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 用户 ...
随机推荐
- LeetCode OJ 107. Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- Git合并分支出现的冲突解决
人生不如意之事十有八九,合并分支往往也不是一帆风顺的. 我们准备新的分支newbranch. LV@LV-PC MINGW32 /c/gitskill (master)$ git checkout - ...
- Light OJ 1136
Division by 3. 发现一些规律: 一个数的数字和相加能被三整除,那么这个数也能被3整除.(1) 然后可以发现: 连续三个整数并排在一起组成的数的数字和必然能被3整除.(2) 最后通过(2) ...
- 依赖注入(DI)和控制反转(IOC)【回顾】
在java开发中广泛的使用了IOC的思想,在PHP中同样也在广泛使用. interface Coder { public function coding(); } 实现类Javaer class Ja ...
- onPostCreate——Activity彻底运行起来之后的回调
记得之前想要在Activity布局完成,彻底跑起来之后,再获取当前Activity的窗口中,某个View的宽高,之前用的办法很土,弄个Handler,发个Message出来,使用sendMessage ...
- Outing
Outing 题目描述 Organising a group trip for the elderly can be a daunting task... Not least because of t ...
- POJ 2031 Building a Space Station 最小生成树模板
题目大意:在三维坐标中给出n个细胞的x,y,z坐标和半径r.如果两个点相交或相切则不用修路,否则修一条路连接两个细胞的表面,求最小生成树. 题目思路:最小生成树树模板过了,没啥说的 #include& ...
- java的两种异常runtimeException和checkedException
java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字. try 关键字后紧跟一个花括号括起来的代码块,简称try块.同理:下面的也被称为相应的块. ...
- Learning Java characteristics (Java in a Nutshell 6th)
Java characteristics: Java .class files are machine-independent, including the endianness. Java .cla ...
- mysql 初始化时root无密码
修改密码 update user set password=PASSWORD('123456') where User='root'; 添加用户设置权限 grant select,insert,upd ...