添加一个系统服务sytem service

方法一:

1.在应用中
com.xxx.spi.SPLListener.java/com.xxx.spi.SPIManager.java两个类
SPIManager spiManager = (SPIManager) getSystemService("spiService");
spiListener = new MySPIListener();
spiManager.requestSPIUpdates(spiListener);

2.
需在android.app.ContextImpl.java中添加
private static SPIManager sSPIManager;
else if (SPI_SERVICE.equals(name)) {
            return getSPIManager();
        }

private SPIManager getSPIManager() {
        synchronized (sSync) {
            if (sSPIManager == null) {
                IBinder b = ServiceManager.getService(SPI_SERVICE);
                ISPIManager service = ISPIManager.Stub.asInterface(b);
                sSPIManager = new SPIManager(service);
            }
        }
        return sSPIManager;
    }

在android.content.Context.java中添加常量
public static final String SPI_SERVICE = "spiService";

3.com.xxx.spi.SPIManager.java
中有ISPIListerner.aidl的实现类ListenerTransport
private class ListenerTransport extends ISPIListener.Stub
ListenerTransport中有应用中注册进来的回调监听器SPIListener
ListenerTransport传给frameworks/base/services/java/com/android/server/SPIManagerrService.java服

务器类,也就是aidl的回调注册,一定是实现ISPIListener.stub的ListenerTransport类
SPIManagerService.java是通过jni调C++文件,其中需要把自己作为c++的回调对象,
在cpp文件中取得SPIManagerService类对象
static { class_init_native(); }初始化回调的方法,这样在cpp文件中就随时可以调class_init_native本地

方法中初始化过的函数。

4.frameworks/base/Android.mk文件中编译ISPIListener.aidl,ISPIManager.aidl两个文件成相应的java文件
frameworks/base/services/jni/Android.mk文件中编译同目录下的

com_android_server_SPIManagerService.cpp文件,注意cpp文件的命名与其对应的SPIManagerService.java

文件的包路径之间的关系。
同目录下的onload.cpp文件中添加
int register_android_server_SPIManagerService(JNIEnv* env);
register_android_server_SPIManagerService(env);

5.
frameworks/base/services/java/com/android/server/SystemServer.java中添加服务,并调服务的

systemReady方法
try {
                Slog.i(TAG, "---SPI Manager---");
                spiService = new SPIManagerService(context);
                ServiceManager.addService("spiService", spiService);
            } catch (Throwable e) {
                Slog.e(TAG, "---Failure starting spiService Manager---", e);
            }

if (spiServiceF != null) spiServiceF.systemReady();

6.
frameworks/base/core/jni/AndroidRuntime.cpp中添加
extern int register_android_server_SPIManagerService(JNIEnv* env);
不确定是不是必须的

方法二:

在systemserver.java中添加自己有make文件创建的包

System.loadLibrary("android_servers");
        System.loadLibrary("serialserver");

时间: 2024-10-31 02:01:04

添加一个系统服务sytem service的相关文章

Android添加一个系统service

指定一个接口 该例使用了AIDL,因此第一步添加一个接口定义文件. frameworks/base/core/java/android/os/IEneaService.aidl package android.os; interface IEneaService { /** * {@hide} */ void setValue(int val); } 这个文件将被添加到系统build文件中: frameworks/base/Android.mk 添加下面的内容在 165行 ( SRC_FILES

jsp-JSP页面添加一个“查询”按钮,查询条件为“姓名”反正就是字符串就行

问题描述 JSP页面添加一个"查询"按钮,查询条件为"姓名"反正就是字符串就行 JSP页面添加一个"查询"按钮,查询条件为"姓名"反正就是字符串就行,应该怎么写,对应的action和daoa怎么写?求代码~最主要,我是想知道,字符串怎么传值的,数据类型转换吗?所以我想看看代码..我用的是ssh架构,IntelliJ IDEA 10.5工具,拜托各位大神啦 解决方案 就正常的提交请求呀,和增删查改一样的 解决方案二: 很简单,按

service-Android程序添加一个服务,如果程序遇到异常退出,则服务重启程序

问题描述 Android程序添加一个服务,如果程序遇到异常退出,则服务重启程序 在程序中添加一个服务,这个服务的功能包括: 1.在主程序启动时启动服务. 2.在主程序退出时退出服务 3.在主程序异常退出时负责重启主程序 4.当服务异常退出时主程序负责重启服务. 希望大家提供思路 解决方案 1.2,两点建立一对Activity(主程序)和Service,Activity创建时开启服务,Activity退出时关闭服务. 3.4,将主程序和服务放在两个进程中,分别开线程检测对方进程是否存在,如果不存在

应用-window下用delphi写一个系统服务的问题

问题描述 window下用delphi写一个系统服务的问题 window下用delphi写一个系统服务,系统服务再生成一个form,求大神指点下这个为什么没生成窗口 这是service application的代码 unit Unit_Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,Unit3; type TServiceDemo = class(TSer

购物车中只能添加一个商品,第二次添加就会把第一次给覆盖掉了,怎么办?

问题描述 action中的代码如下:import java.util.Date;import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import org.apache.struts2.interceptor.SessionAware;import com.opensympho

如何在ssi框架添加一个页面查询

问题描述 在一个完整的ssi框架项目中,添加一个页面查询,该如何实现??? 解决方案 解决方案二: 查询,是select么,这有区别么,页面还是那么传参数,后台就看你sql怎么写了解决方案三: 楼主的问题是什么?如果问流程的话就是页面输入查询参数-----action接收并处理封装------service接收封装好的参数进行业务逻辑上的处理后调用dao-------dao使用SqlMapClientTemplate.queryForList方法查询--------读取配置文件的xml得到Lis

添加一个与root相同权限的用户

如果希望添加一个拥有root权限的账号test,可参考以下步骤进行,当然,以下的步骤必须有root权限才能运行: Step1 添加一个一般的用户test. useradd -m test Step2 改变test的密码 passwd test 运行后,系统会询问密码,输入后,会再确认一次. Step3 修改/etc/passwd文件,将test的gid(组ID,uid不能为0否则丢失数据)改为0 第一个0是uid,第二个0是gid.uid是唯一的,gid可以相同.root的uid已经是0了,所以

javascrpit-给一个按钮点击事件,点击的同时给按钮添加一个样式,怎么样使进行其他操作的时候恢复按钮的样式

问题描述 给一个按钮点击事件,点击的同时给按钮添加一个样式,怎么样使进行其他操作的时候恢复按钮的样式 比如点击弹出个对话框,我关闭对话框后,按钮恢复原来的样式 解决方案 对话框插件一般有关闭事件,你配置那个关闭事件删除添加的高亮样式即可.具体看你的对话框API了

button-Android:如何添加一个自定义的按钮状态

问题描述 Android:如何添加一个自定义的按钮状态 例如默认按钮在它的状态和背景图片之间具有以下依赖: <?xml version=""1.0"" encoding=""utf-8""?><selector xmlns:android=""http://schemas.android.com/apk/res/android""> <item androi