首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

平添一个系统服务sytem service

2012-07-15 
添加一个系统服务sytem service方法一:1.在应用中com.xxx.spi.SPLListener.java/com.xxx.spi.SPIManager.j

添加一个系统服务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");

热点排行