一、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的注册

  1. try {
  2. Slog.i(TAG, "DemoSystem service");
  3. ServiceManager.addService("demosystemservice",
  4. new DemoSystemManager(context));
  5. } catch (Throwable e) {
  6. reportWtf("starting DemoSystemService", e);
  7. }

2.按照AIDL的设计要求,DemoSystemService必须提供相应的AIDL文件,并实现AIDL的标准接口

先是AIDL标准接口的设定

  1. package android.app;
  2.  
  3. interface IDemoSystemManager
  4. {
  5. boolean getState();
  6. void setState(boolean state);
  7. }

然后是具体系统服务的内容,符合AIDL标准接口

  1. package com.android.server;
  2.  
  3. import android.app.IDemoSystemManager;
  4. import android.util.Log;
  5. import android.content.Context;
  6. public class DemoSystemManager extends IDemoSystemManager.Stub
  7. {
  8. private static final String TAG = "DemoSystemManager";
  9. private Context mContext;
  10. private boolean state = False;
  11. public DemoSystemManager(Context context){
  12. mContext = context;
  13. }
  14. public boolean getState() {
  15. Log.d(TAG,"[getState] state : "+state);
  16. return state;
  17. }
  18.  
  19. public void setState(boolean state) {
  20. Log.d(TAG,"[setState] state : "+state);
  21. return 0;
  22. }
  23. }

3.到此,服务端就已经写好了。下面是客户端如何使用服务。

  1. import android.hardware.DemoSystemManger;
  2.  
  3. private IDemoSystemManager mDemoSystemManager;
  4. mDemoSystemManager = IDemoSystemManager.Stub.asInterface(ServiceManager.getService(“demosystemservice”));

然后就可以直接使用mDemoSystemManger了

4.其他要配置的内容

a.将AIDL文件放到编译android.mk中
  1. frameworks/base/Android.mk文件中的LOCAL_SRC_FILES增加aidl的声明:
  2.  
  3. @@ -, +, @@ LOCAL_SRC_FILES += \
  4.  
  5. core/java/android/app/backup/IFullBackupRestoreObserver.aidl \
  6.  
  7. core/java/android/app/backup/IRestoreObserver.aidl \
  8.  
  9. core/java/android/app/backup/IRestoreSession.aidl \
  10.  
  11. + core/java/android/app/IDemoSystemManger.aidl \
  12.  
  13. core/java/android/bluetooth/IBluetooth.aidl \
  14.  
  15. core/java/android/bluetooth/IBluetoothA2dp.aidl \
b.android5.0之后,如果要新建系统服务,还需要添加权限(此为SELinux带来的影响,SELinux相关内容可网上去查其他文章)
  1. 在/device/sprd/scx35/sepolicy/service_contexts文件中,添加权限
  2.  
  3. atchannel u:object_r:radio_service:s0
  4. fm u:object_r:mediaserver_service:s0
  5. sprdsimphonebook u:object_r:radio_service:s0
  6. sprd_phone u:object_r:radio_service:s0
  7. security u:object_r:system_server_service:s0
  8. board_score u:object_r:system_server_service:s0
  9. phasechecknative u:object_r:system_server_service:s0
  10. demosystemservice u:object_r:system_server_service:s0

注:本文中的例子是一个非常简单的系统服务,如果希望再看下相对复杂点的例子,可以看下面参考文章中的例子,此例子更加生动,代码结构也更加合理。

参考文章:

[android]Framework新增系统服务

Android的系统服务一览

新建android系统服务的更多相关文章

  1. 新建android工程的时候eclipse没有生成MainActivity和layout布局

    一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...

  2. eclipse新建android项目,编译出错解决方法

    1.新建android项目 2.在libs中,将android-support-v4.jar添加到生成目录 3.如果项目引用了ActionBar等,需要引用V7的话,添加外部Jar包,路径为eclip ...

  3. Android系统服务-WindowManager

      WindowManager是Android中一个重要的服务 (Service ).WindowManager Service 是全局的,是唯一的.它将用户的操作,翻译成为指令,发送给呈现在界面上的 ...

  4. 如何解决:新建Android程序的时候发生了找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 的错误

    问题概述: 在新建Android程序的时候出现以下错误: 找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 原因: SDK不完整. 解决方法: 方法一 ...

  5. Android系统服务-简介

    http://blog.csdn.net/chenyafei617/article/details/6577907 Introduction 我们知道Android系统服务挺多的,做程序时经常会用到, ...

  6. Android系统服务详解-android学习之旅(95)

    本文是看完android框架揭秘第六章后的总结 android系统服务提供最基本的,最稳定的核心功能,如设备控制,信息通知,通知设定,以及消息显示等,存在于Android Framework与Andr ...

  7. Android 系统服务的获取与创建

    在Android系统中,有一群很厉害的“家伙”,如果把Android系统比喻成一个大帮派,那么这群“家伙”的地位就像那各个分堂的堂主一样,所有的应用就像是各个小马哥,他们要做什么事情,都要堂主审批,审 ...

  8. Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局

    一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...

  9. eclipse中无法新建Android工程 出现问题:Plug-in org.eclipse.ajdt.ui was unable to load

    转自:http://www.bubuko.com/infodetail-757338.html eclipse中打开后新建Android项目区仍无法创建,出现下列提示对话框: Plug-in org. ...

随机推荐

  1. Important Programming Concepts (Even on Embedded Systems) Part V: State Machines

    Earlier articles in this series: Part I: Idempotence Part II: Immutability Part III: Volatility Part ...

  2. Unity NGUI 网络斗地主 -制作图集 Atlas

    Unity NGUI 网络斗地主 -制作图集 Atlas by @杨海龙 开发环境   Win7+Unity4.2.1f4+NGUI 3.0.4版本 这一节告诉大家如何制作(图集)Atlas! 1.首 ...

  3. 使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  4. 【Linux】鸟哥的Linux私房菜基础学习篇整理(七)

    1. test命令的测试功能.测试的标志:(1)关于文件类型的检测 test [-efdbcSpL] filename-e:该文件名是否存在:-f:该文件名是否为文件:-d:该文件名是否为目录:-b: ...

  5. COJ 0288 路径(2015升级版)

    路径(2015升级版) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ在生日当天决定在他的领地举行一场马拉松比赛,他的 ...

  6. hdu-3487-Play with Chain-(splay 区间翻转,切割,插入)

    题意: 区间翻转,切割,插入 // File Name: ACM/HDU/3487.cpp // Author: Zlbing // Created Time: 2013年08月10日 星期六 21时 ...

  7. POJ 2112 Optimal Milking(Floyd+多重匹配+二分枚举)

    题意:有K台挤奶机,C头奶牛,每个挤奶机每天只能为M头奶牛服务,下面给的K+C的矩阵,是形容相互之间的距离,求出来走最远的那头奶牛要走多远   输入数据: 第一行三个数 K, C, M  接下来是   ...

  8. Jump Game —— LeetCode

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  9. 在kafka上对topic新增partition

    对topic增加partition 参考官网site:http://kafka.apache.org/documentation.html#basic_ops_modify_topic 通过kafka ...

  10. 2012蓝桥杯本科组C/C++决赛题

    星期几 [结果填空] (满分5分) 1949年的国庆节(10月1日)是星期六. 今年()的国庆节是星期一. 那么,从建国到现在,有几次国庆节正好是星期日呢? 只要答案,不限手段! 可以用windows ...