添加service到SystemService: 添加硬件服务。
创建时间:2015年3月9日(星期一) 晚上11:07 | 分类:硬件驱动Android | 天气: 
修改时间:2015年3月10日(星期二) 中午11:37
<note_content>

.添加service到SystemService

测试的service类是InnerToolService,表示内置到framework的自定义服务,使用的aidl包括:

IInnerToolService  定义接口,InnerToolService实现该接口
IInnerToolCB.aidl  定义回调  不熟悉aidl的话可以先不加

1).添加需要的Service的java文件。

注意:包名也要一样。package com.android.server;然后找到SystemServer,修改如下在ServerThread的run方法里添加

//add innertool
try {
ServiceManager.addService("innertool", new InnerToolService(context));
} catch (Throwable e) {
}
//End 

注意"innertool"相当于service的标记,在使用getSystemService来获取时需要提供该标记。

2).frameworks\base\core\java\android\app\ContextImpl.java

这里主要是响应getSystemService,如果service未启动,则启动service。(与manager关联)

首先添加import语句
//inner tool
import com.android.innertool.IInnerToolService;
//End 然后在内部类ServiceFetcher的static语句块里添加以下代码: //add innertool
registerService("innertool", new ServiceFetcher() {
public Object getService(ContextImpl ctx) {
IBinder b = ServiceManager.getService("innertool");
IInnerToolService service = IInnerToolService.Stub.asInterface(b);
Log.e("tool", "fetch innertool service = " + service);
return service;
}});
//End
  1. 其次在context/context.java中添加对应函数
3).aidl相关文件的编译
framework/base/Android.mk文件,在LOCAL_SRC_FILES下添加相关的aidl文件

        LOCAL_SRC_FILES += \
innertool/java/com/android/innertool/IInnerToolService.aidl \
innertool/java/com/android/innertool/IInnerToolCB.aidl

到这里基本就添加完成了,可能部分不同的平台或者项目会存在差异,大家需要细心。然后是对于远程service的调用

假设aidl定义的接口如下

interface IInnerToolService{
void exec(String arg0,String arg1,IInnerToolCB arg2);
}

2.通过aidl调用远程service

上面定义了aidl文件,使用的包名是com.android.innertool,那我们本地应用也需要有这个包名下的aidl文件

即测试应用需要创建com.android.innertool这个包,并将IInnerToolService.aidl和IInnerToolCB.aidl文件放进去,这样会在gen/生成对应的java文件。

然后就可以使用该SystemService的接口了。

private IInnerToolService toolService2;
toolService2 = (IInnerToolService) getSystemService("innertool");
try {
toolService2.exec("aaa", "bbb", new InnerToolCB());
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
这样基本就走通了简单的调用流程。

附上相应的代码

package com.android.server;

import android.content.Context;
import android.os.RemoteException;
import android.util.Log; import com.android.innertool.IInnerToolCB;
import com.android.innertool.IInnerToolService; public class InnerToolService extends IInnerToolService.Stub{ private Context mContext; public InnerToolService(Context context) {
mContext = context;
} @Override
public void exec(String arg0, String arg1, IInnerToolCB arg2)
throws RemoteException {
// TODO Auto-generated method stub
Log.v("InnerToolService", "exec,"+arg0+","+arg1+","+arg2);
}
}
==========================================
注意: 如果在Android源码中添加了自定义的包、类、方法或者你修改了android源码中标识为“@hide”的方法、类,你需要这些内容对Application可见并且需要编译进sdk中的Document中的话,需要执行
      make update-api
==========================================

添加service到SystemService硬件服务的更多相关文章

  1. 问题:Custom tool error: Failed to generate code for the service reference 'AppVot;结果:添加Service Reference, 无法为服务生成代码错误的解决办法

    添加Service Reference, 无法为服务生成代码错误的解决办法 我的解决方案是Silverlight+WCF的应用,Done Cretiria定义了需要在做完Service端的代码后首先运 ...

  2. linux 添加 service 服务并自动添加 chkconfig 启动级别

    下面以添加一个叫做watchcat的服务为例进行说明: 1.写一个提供给service命令使用的脚本 service 命令的使用方法一般如下 启动: $ service watchcat start ...

  3. Android 从硬件到应用程序:一步一步爬上去 5 -- 在Frameworks蒂姆层硬件服务

    Android Frameworks层提供硬件服务,Android系统APP能够调用这些硬件服务,而硬件则完全控制.实现应有的功能.上一页下一页.为了这一个frameworks高层的应用java接口硬 ...

  4. LBS(Location Based Service)(基于位置的服务)

    LBS(Location Based Service)(基于位置的服务) Android 中定位方式基本可以分为两种:GPS定位,网络定位. GPS定位的工作原理是基于手机内置的GPS硬件直接和卫星进 ...

  5. Tiny4412 LED 硬件服务

    1.Android系统中启动框架 2.首先实现驱动程序 #include <linux/kernel.h> #include <linux/module.h> #include ...

  6. 转:无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动

    今天看到一篇文章感觉不错,收藏转载下. 原文地址:http://blog.csdn.net/sntyy/article/details/2090347 版权为原作者所有 无法向会话状态服务器发出会话状 ...

  7. Android Service学习之本地服务

    Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过来声明.可以通过contect.startservice和contect.bindse ...

  8. 在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务(老罗学习笔记6)

    一:Eclipse下 1.创建工程: ---- 2.创建后目录 3.添加java函数 4.在src下创建package,在package下创建file 5.res---layout下创建xml文件,命 ...

  9. 为Android系统内置Java应用程序测试Application Frameworks层的硬件服务

    我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务.那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务 ...

随机推荐

  1. Git版本管理:Windows下Git配置与使用指南 Gitlab

    简要介绍:Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理. 一.安装 软件:msysGit-fullinstall-1.8.1.2 打开之后设置安装路径,默认为 ...

  2. 第七篇、hitTest UITabbar中间突出按钮额外增加可点击区域

    简介: 以前UITabbar使用中间有一个凸起按钮时,常常就需要用到hitTest来处理可点击的范围. 示例代码: - (UIView *)hitTest:(CGPoint)point withEve ...

  3. UISearchController的使用。(iOS8+)

    这种方法早就发现了,不过一致没用,今天拿过来用,发现了一些问题. 1.这个东西和表视图结合使用很方便,首先,创建新的工程,将表视图控制器作为工程的根视图,并且添加一个导航(当然,你可以不这样做,但是你 ...

  4. 12天学好C语言——记录我的C语言学习之路(Day 9)

    12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...

  5. 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

    中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030 内容详见: http://www.360doc.com/content/11/1004/12/6139921_1 ...

  6. FlashBuilder启动时一闪而过

    晚上的时候把项目目录直接剪切走了 早晨就打不开了 去workspace看log  .\workspace\.metadata\.log 发现如下代码!MESSAGE Could not read me ...

  7. 306573704 Char型和string型字符串比较整理(转)

    1.赋值 char赋值: char ch1[] = "give me"; char ch2[] = "a cup"; strcpy(ch1,ch2); cout ...

  8. OpenCV2学习笔记03:Qt中配置OpenCV环境

    在Qt中开发基于OpenCV的应用时,需要配置对应函数库到环境变量,这时候我们需要使用到qmake能够识别的变量来指定环境变量. INCLUDEPATH: 用于指定搜索头文件到文件夹路径. LIBS: ...

  9. memcached全面剖析--2

    理解memcached的内存存储 下面是<memcached全面剖析>的第二部分. 发表日:2008/7/9 作者:前坂徹(Toru Maesaka) 原文链接:http://gihyo. ...

  10. Yii框架下使用redis做缓存,读写分离

    Yii框架中内置好几个缓存类,其中有memcache的类,但是没有redis缓存类,由于项目中需要做主从架构,所以扩展了一下: /** * FileName:RedisCluster * 配置说明 * ...