新建android系统服务
2016-02-22 16:24
471 查看
一、Android系统服务
Android提供了很多系统服务:如ActivityManger,PowerManger,WindowManger,WifiManger等等。这些服务都是系统启动开始就一直常驻的,如果app需要使用相应的系统服务(如获取当前wifi的状态),则需要通过Binder去访问系统服务。
例如:WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
二、Binder进程间通信
app间如何通过binder进行进程间通讯(通常是一个app要使用另一个app提供的服务),见android bindService() 和 Android AIDL通过查看源码我们可以看到,一般情况下,系统服务通过AIDL定义开放接口。整体调用关系和app进程间通信是一样的。
三、将服务设置为系统服务
一般app提供的service,必须要手动启动或者开机启动,且app级别的service在资源紧缺时也比较容易被杀死。那么我们能不能将哪些需要常驻的服务就设置为系统服务呢?
步骤:
1.我们仿照原生的系统服务(如ActivityManger,PowerManger,WindowManger,WifiManger),注册相关的服务。
比如,我们要新注册的系统服务就叫做DemoSystemService。我们找到原生系统服务注册的地方,SystemServer.java的startOtherServices()方法,加上如下代码,完成对DemoSystemService的注册
try { Slog.i(TAG, "DemoSystem service"); ServiceManager.addService("demosystemservice", new DemoSystemManager(context)); } catch (Throwable e) { reportWtf("starting DemoSystemService", e); }
2.按照AIDL的设计要求,DemoSystemService必须提供相应的AIDL文件,并实现AIDL的标准接口
先是AIDL标准接口的设定package android.app; interface IDemoSystemManager { boolean getState(); void setState(boolean state); }
然后是具体系统服务的内容,符合AIDL标准接口
package com.android.server; import android.app.IDemoSystemManager; import android.util.Log; import android.content.Context; public class DemoSystemManager extends IDemoSystemManager.Stub { private static final String TAG = "DemoSystemManager"; private Context mContext; private boolean state = False; public DemoSystemManager(Context context){ mContext = context; } public boolean getState() { Log.d(TAG,"[getState] state : "+state); return state; } public void setState(boolean state) { Log.d(TAG,"[setState] state : "+state); return 0; } }
3.到此,服务端就已经写好了。下面是客户端如何使用服务。
import android.hardware.DemoSystemManger; private IDemoSystemManager mDemoSystemManager; mDemoSystemManager = IDemoSystemManager.Stub.asInterface(ServiceManager.getService(“demosystemservice”));
然后就可以直接使用mDemoSystemManger了
4.其他要配置的内容
a.将AIDL文件放到编译android.mk中在frameworks/base/Android.mk文件中的LOCAL_SRC_FILES增加aidl的声明: @@ -112,6 +112,7 @@ LOCAL_SRC_FILES += \ core/java/android/app/backup/IFullBackupRestoreObserver.aidl \ core/java/android/app/backup/IRestoreObserver.aidl \ core/java/android/app/backup/IRestoreSession.aidl \ + core/java/android/app/IDemoSystemManger.aidl \ core/java/android/bluetooth/IBluetooth.aidl \ core/java/android/bluetooth/IBluetoothA2dp.aidl \
b.android5.0之后,如果要新建系统服务,还需要添加权限(此为SELinux带来的影响,SELinux相关内容可网上去查其他文章)
在/device/sprd/scx35/sepolicy/service_contexts文件中,添加权限 atchannel u:object_r:radio_service:s0 fm u:object_r:mediaserver_service:s0 sprdsimphonebook u:object_r:radio_service:s0 sprd_phone u:object_r:radio_service:s0 security u:object_r:system_server_service:s0 board_score u:object_r:system_server_service:s0 phasechecknative u:object_r:system_server_service:s0 demosystemservice u:object_r:system_server_service:s0
注:本文中的例子是一个非常简单的系统服务,如果希望再看下相对复杂点的例子,可以看下面参考文章中的例子,此例子更加生动,代码结构也更加合理。
参考文章:
[android]Framework新增系统服务
Android的系统服务一览
相关文章推荐
- 使用Android studio创建的AIDL编译时找不到自定义类的解决办法
- Android签名证书的sha1值获取
- Android-Chart
- Android-Chart
- android studio教学视频资源(点开即看)
- Android Studio使用指南
- Android 2016新技术
- android串口通信——电子锁
- android串口通信——电子锁
- android开发步步为营之94:使用PathEffect画虚线和虚线框
- android studio快捷键
- ANDROID_MARS学习笔记_S05_003_传感器采样率及属性
- 关于intent中android.intent.action.USER_PRESENT的说明
- 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子
- 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子
- Android应用开发中Fragment存储功能的基本用法
- Android自定义view-弹性ScrollView(上)
- Android学习笔记-界面和数据存储以及一些零碎知识点
- Android-Tab
- Android-Tab