您的位置:首页 > 移动开发 > Android开发

android framework添加系统服务

2016-12-14 14:09 399 查看
http://blog.csdn.net/pierce0young/article/details/24424991

在android源码中添加系统服务,如在android.app包下增加DevInfoManager.java, 按照如下步骤处理:

1. 在framework/base/core/java/android/app/目录下增加 DevInfoManager.java 及 IDevInfoManager.aidl 文件

注意:此处可以根据实际情况添加到合适的包中,在framework/base/core/java/andorid目录下。

DevInfoManager.java如下:

**************************************************************************************************

package android.app;

import android.os.Handler;

import andorid.os.RemoteException;

import android.util.Log;

public class DevInfoManager{

public static final String TAG = "DevInfoManager";

IDevInfoManager mService;

Handler mHandler;

public DevInfoManager(IDevInfoManager service, Handler handler){

mService = service;

mHandler = handler;

}

public String getValue(String name){

try{

return mService.getValue(name);

}catch(RemoteException e){

Log.d(TAG, "get value RemoteException");

}

return null;

}

public int update(String name, String value, int attribute){

try{

return mService.update(name, value, attribute);

}catch(RemoteException e){

Log.d(TAG, "update value RemoteException");

}

return -1;

}

}

**************************************************************************************************

IDevInfoManager.aidl文件如下:

**************************************************************************************************

package android.app;

/**{@hide}*/

interface IDevInfoManager{

String getValue(String name);

int setValue(String name, String value, int attribute);

}

**************************************************************************************************

如果在方法上面添加 /**{@hide}*/ 修饰的话,表示api不提供对外接口,在执行make update-api后不会出现在framework/base/core/java/android/content/Context中。

2. 添加相应的Service类,在framework/base/services/java/com/android/server下添加DevInfoService.java文件

DevInfoService.java文件如下:

**************************************************************************************************

package com.android.server;

import android.app.IDevInfoManager;

import android.util.Log;

import android.content.Context;

public class DevInfoService extends IDevInfoManager.Stub{

private static final String TAG = "DevInfoManagerService";

private Context mContext;

public DevInfoService(Context context){

mContext = context;

}

public String getValue(String name){

Log.d(TAG, "get name: " + name);

return name;

}

public int setValue(String name, String value, int attribute){

return 0;

}

}

**************************************************************************************************

注意:此处最好自建一个目录,不要打乱系统的存放目录的结构

3. 在SystemServer中生成该Service并添加到ServiceManager中:

在framework/base/services/java/com/android/server/SystemServer.java中添加:同其他服务一样,在startOtherServices()方法中添加:

**************************************************************************************************

DevInfoService devInfoService = null;

try{

devInfoService = new DevInfoService(context);

ServiceManager.addService(Context.DEVINFO_SERVICE, devInfoService);

}catch(Throwable e){

Slog.e(TAG, "add DevInfoService failure");

}

**************************************************************************************************

表示在SystemServer中启动服务

4. 需要在framework/base/core/java/android/app/ContextImpl.java中增加servcie注册,如下:

在StaticServiceFetcher抽象类中添加如下内容

**************************************************************************************************

registerService(DEVINFO_SERVICE, new DevInfoService(){

public Object createService(ContextImpl ctx){

IBinder b = ServiceManager.getService(DEVINFO_SERVICE);

IDevInfoManager service = IDevInfoManager.Stub.asInterface(b);

return new DevInfoManager(service, ctx.mMainThread.getHandler());

}

});

**************************************************************************************************

5. 在framework/base/core/java/android/content/Context.java中添加Services名称定义:

**************************************************************************************************

public static final String DEVINFO_SERVICE = "devinfo";

**************************************************************************************************

6. 在framework/base/Android.mk文件中的LOCAL_SRC_FILES添加 aidl 的声明:

LOCAL_SRC_FILES += \

core/java/android/app/IDevInfoManager.aidl \

7. 进行编译,因为framework有变更,所以需要先update-api,在然后编译framework

此处,执行make update-api去更新,如果方法没有家hide标记,就会在current.txt中找到你新加的服务方法。

8. 调用

import android.app.DevInfoService;

DevInfoService devInfoservice = (DevInfoService)this.getSystemService(Context.DEVINFO_SERVICE);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: