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 就大功告成了。
- Android 添加系统服务
- Android 添加系统服务
- Android 添加系统服务
- Android 添加系统服务
- Android 添加系统服务
- Android 添加系统服务
- android添加系统服务
- Android 添加系统服务
- Android 添加系统服务
- Android 添加系统服务
- Android 添加系统服务
- android 添加系统服务
- android添加系统服务
- android 添加系统服务
- 为Android系统添加服务
- android framework添加系统服务
- android framework 添加系统服务
- android系统添加启动服务
- 基于Hexo的博客同步中的一些问题
- Python Notes (5)
- org.wildfly.plugin.common.DeploymentExecutionException: Deployment failed: Operation failed:... 问题解决
- Java 集合的总结
- input标签file类型,选择多个文件进行上传
- android 添加系统服务
- 请求重定向与请求转发
- 1002. A+B for Polynomials (25)[C语言]
- java中==和equals()的区别
- JDBC&DBCP
- 参与github上开源项目的大致流程和注意事项
- groovy进行数据库操作
- Java虚拟机之内存区域与内存溢出异常总结
- 字符串区别于字符数组