新建android系统服务
一、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的声明:
@@ -, +, @@ 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系统服务的更多相关文章
- 新建android工程的时候eclipse没有生成MainActivity和layout布局
一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...
- eclipse新建android项目,编译出错解决方法
1.新建android项目 2.在libs中,将android-support-v4.jar添加到生成目录 3.如果项目引用了ActionBar等,需要引用V7的话,添加外部Jar包,路径为eclip ...
- Android系统服务-WindowManager
WindowManager是Android中一个重要的服务 (Service ).WindowManager Service 是全局的,是唯一的.它将用户的操作,翻译成为指令,发送给呈现在界面上的 ...
- 如何解决:新建Android程序的时候发生了找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 的错误
问题概述: 在新建Android程序的时候出现以下错误: 找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 原因: SDK不完整. 解决方法: 方法一 ...
- Android系统服务-简介
http://blog.csdn.net/chenyafei617/article/details/6577907 Introduction 我们知道Android系统服务挺多的,做程序时经常会用到, ...
- Android系统服务详解-android学习之旅(95)
本文是看完android框架揭秘第六章后的总结 android系统服务提供最基本的,最稳定的核心功能,如设备控制,信息通知,通知设定,以及消息显示等,存在于Android Framework与Andr ...
- Android 系统服务的获取与创建
在Android系统中,有一群很厉害的“家伙”,如果把Android系统比喻成一个大帮派,那么这群“家伙”的地位就像那各个分堂的堂主一样,所有的应用就像是各个小马哥,他们要做什么事情,都要堂主审批,审 ...
- Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局
一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...
- eclipse中无法新建Android工程 出现问题:Plug-in org.eclipse.ajdt.ui was unable to load
转自:http://www.bubuko.com/infodetail-757338.html eclipse中打开后新建Android项目区仍无法创建,出现下列提示对话框: Plug-in org. ...
随机推荐
- Hibernate 配置详解(3)
7) hibernate.max_fetch_depth: 该属性用于设置left out join单对象查询关系(one-to-one/many-to-one)中最大的关联深度.默认值为0,即默认情 ...
- 对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
| test100 | CREATE TABLE `test100` ( `sn` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增编号', `phoneNo` ...
- COJ 2105 submatrix
submatrix 难度级别: A: 编程语言:不限:运行时间限制:2000ms: 运行空间限制:131072KB: 代码长度限制:102400B 试题描述 小A有一个N×M的矩阵,矩阵中1~N* ...
- hdu-4638-Group(树状数组)
题意 找到区间里有多少组连续数字串 分析: (转)思路:显然,我们要使得value最大,就要尽量将连续的ID分在一组,所以问题转化为求一个区间中连续ID区间的个数.我们从左往右扫描,依次考虑右端点为i ...
- HDU 4612 Warm up(手动扩栈,求树上哪两个点的距离最远)
题目大意: 给你一个无向图,问加一条边之后最少还剩下几座桥. (注意重边处理) 分析:其实当我们把边双连通分量给求出来之后我们就能将连通块求出来,这样我们就可以重新构图.重新构造出来的图肯定是一颗 ...
- POJ 3694 Network(无向图求桥+重边处理+LCA)
题目大意: 给你一个无向图,然后再给你一个Q代表有Q次询问,每一次加一条边之后还有几座桥.在这里要对重边进行处理. 每次加入一条边之后,在这条搜索树上两个点的公共祖先都上所有点的桥都没了. 这里重边的 ...
- 数据结构(二维线段树,差分): NOI2012 魔幻棋盘
貌似想复杂了…… #include <iostream> #include <cstring> #include <cstdio> #define mid ((l+ ...
- 【图论】Codeforces 711D Directed Roads
题目链接: http://codeforces.com/problemset/problem/711/D 题目大意: 给一张N个点N条有向边的图,边可以逆向.问任意逆向若干条边使得这张图无环的方案数( ...
- WebBrowser控件默认使用IE9,IE10的方法
1,打开注册表 HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER) SOFTWARE Microsoft Internet E ...
- datagridview bindingsource刷新数据
调用bindindsource的ResetBindings() 方法