zoukankan      html  css  js  c++  java
  • 【转】Android 添加系统服务

    Android系统本身提供了很多系统服务,如WindowManagerService,PowerManagerService等。下面描述一下添加一个系统服务的具体步骤。

    1、  撰写一个aidl文件,定义服务的接口,将在编译过程中通过aidl工具生成对应的java接口。一般系统服务的aidl文件都放在frameworkasecorejavaandroidos目录中。

    以我所写的IMyTool.aidl为例。在.aidl中定义自己需要加入的方法,编写规则和java接口差不多,这里不多说。

    2、  将aidl文件名添加到frameworksase目录下的Android.mk编译脚本文件中。

    如:

    LOCAL_SRC_FILES +=

             core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl

             …

             core/java/android/os/IMyTool.aidl

             …

    IMyTool.aidl即我加进去的aidl文件,加入后才能在make过程中编译到,否则将在后面的SystemServer添加系统服务时会报错提示找不到对应类。

     

    3、  编写真正工作的服务类,继承IMyTool.Stub类(AIDL文件名.Stub,aidl生成的接口中的内部类,是一个Binder)。

    服务类一般都放在frameworkaseservicesjavacomandroidserver目录中。

    例如:

    public class MyToolService extends IMyTool.Stub {

               实现IMyTool.aidl中定义的接口。

    }

     

    4、  将自定义服务注册到SystemServer,使得开机过程中被添加。

    在frameworkaseservicesjavacomandroidserver目录中的SystemServer中启动服务代码处加入:

    try {

               Slog.i(TAG, "MyToolService");

               ServiceManager.addService(Context.MY_TOOL_SERVICE,new MyToolService(context));// MyToolService构造函数自己定义,一般都会用到Context

    } catch(Throwable e) {

               Slog.e(TAG, "Failure startingMyToolService", e);

    }

    上面代码中Context.MY_TOOL_SERVICE是自己在Context类中定义的常量,也就是给服务定义的名字,使用常量方便获取服务,而不需要记住注册服务时用的名字,且想换名字时只需改一个常量的值。

    5、  由于在工程中添加了自己定义的类及常量,系统的api没有更新,因此需要先在工程中make clean然后make update-api,执行完后会发现frameworksaseapicurrent.xml文件中多出自己定义的一些东西。current.xml这个文件包含了所有系统所有能被应用层使用的类及其方法等。

    之后再使用make编出来的固件及jar包就能包含自定义的接口。


     

    编译后如何使用:

    将编出来的jar包通过lib方式导入工程。jar包位置:out argetcommonobjJAVA_LIBRARIESframework_intermediatesclasses.jar

    调用以下代码获取自定义服务:

    IMyTool myTool = IMyTool.Stub.asInterface(ServiceManager.getService(MY_TOOL_SERVICE));

    MY_TOOL_SERVICE即在Context中定义的常量。获取到myTool后就可以调用在aidl文件中定义的接口了。

    转自:http://www.360doc.com/content/12/0719/19/87000_225297295.shtml

  • 相关阅读:
    REST论文原文
    Rest无状态的一点理解(转)
    Kafka入门
    C#中@的用法总结(转)
    反应器(Reactor)用于事件多路分离和分派的体系结构模式
    数据库的脏读、不可重复读、幻读
    面向对象执行过程内存分析
    基于oracle的sql优化
    深入理解Spring中bean的生命周期
    Spring 框架原理
  • 原文地址:https://www.cnblogs.com/meizixiong/p/3287456.html
Copyright © 2011-2022 走看看