android 添加系统服务

来源:互联网 发布:九章算法 培训视频 编辑:程序博客网 时间:2024/06/05 18:55

本文基于android 6.0,添加了一个自定义的系统服务,并且可以获取使用该服务。

目标:

1,创建一个系统服务, MyService

2,在android系统中使用getSystemService方法获取该服务并调用里面的方法。

1,创建aidl文件

在frameworks/base/core/java/android/os/

文件下面新增 一个 IMyService.aidl 文件,内容如下,

package android.os;interface IMyService {    void setName(String mname);    String getName();}

包含2个简单的方法。

2,aidl文件编译

将此aidl文件加入编译列表frameworks/base/Android.mk:

LOCAL_SRC_FILES += \•••core/java/android/os/IMyService.aidl \

3,创建Service文件

在frameworks/base/services/core/java/com/android/server/ 路径下新增一个 MyService.java 来实现aidl文件定义的接口。

内容如下,

package com.android.server;import android.os.IMyService;class MyService extends IMyService.Stub {        private String myName ;        public MyService(){            }        @Override    public void setName(String mname){        myName = mname;    }        @Override    public String getName(){        return myName;    }}

4,添加管理类MyServiceManager

在frameworks/base/core/java/android/app/ 下创建MyServiceManager.java,

内容如下,

package android.app;import android.os.IMyService;import android.content.Context;import android.os.RemoteException;import android.util.Log;public class MyServiceManager {    IMyService mmyService;        public MyServiceManager(Context mContext, IMyService service){        mmyService = service;    }        public void setName(String mname){        try{            mmyService.setName(mname);        }catch(Exception e){            Log.e("MyService",e.toString());        }    }        public String getName(){        try{            return mmyService.getName();        }catch(Exception e){            Log.e("MyService",e.toString());        }        return null;    }}

5,服务注册

首先给服务命名,在在frameworks/base/core/java/android/content/Context.java 中添加

public static final String MY_SERVICE="my_service";

然后在frameworks/base/services/java/com/android/server/SystemServer.java的startOtherServices方法的try模块中添加

ServiceManager.addService(Context.MY_SERVICE, new MyService());

最后在frameworks/base/core/java/android/app/SystemServiceRegistry.java中的静态代码块中添加

registerService(Context.MY_SERVICE, MyServiceManager.class, new CachedServiceFetcher<MyServiceManager>() {@Overridepublic MyServiceManager createService(ContextImpl ctx) {        IBinder b = ServiceManager.getService(Context.MY_SERVICE);        IMyService service = IMyService.Stub.asInterface(b);        return new MyServiceManager(ctx, service);}});

6,启动服务

在/external/sepolicy/service.te中添加

type my_system_service, system_api_service, system_server_service, service_manager_type;

在/external/sepolicy/service_contexts 中添加

my_service          u:object_r: my_system_service:s0

注意:服务的命名my_service一定要对上号。

这一步骤如果未添加,获取服务时会有空指针错误。

7,编译

首先需要make update-api,然后编译。

8,获取使用服务

mMyServiceManager = (MyServiceManager)getSystemService(Context.MY_SERVICE);mMyServiceManager.setName("my_stystem_service"); Log.d(TAG , mMyServiceManager.getName());  //输出  my_stystem_service 就大功告成了。
0 0
原创粉丝点击