新建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的注册

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标准接口的设定

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的系统服务一览

时间: 2024-12-26 01:48:57

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

Android 系统服务

Android系统服务大致分为三大类:本地守护进程.Native系统服务和Java系统服务.如下图所示: 本地守护进程 init进程根据init.rc文件中的定义,启动本地守护进程.这些进程会常驻在系统中,有的只会启动一次,有的如果退出了,还会被init启动.具体的启动方式就在init.rc中定义. 下面大体列举几个守护进程及其功能. 守护进程 功能 vold 管理存储设备,自动安装存储设备,将设备分区格式化 netd 管理蓝牙.wifi.usb等各种网络连接 installd 负责安装及卸载软

新建Android工程遇到几个问题

室友都睡了,还在苦逼的搞电脑...脖子疼还没好.. 今晚在新建Android工程时遇到几个问题在网上找了有一会,总结一下: 1.新建Android工程时发现finish不能点击或者点击后没有反应. 问题原因:新建的工程名和之前存在过的某个工程名重复了. 解决方法:为新工程换个名字. 2.新建工程后出现appcompat_v7这样一个东西而且会报错,新建的工程则是红色警告. 问题原因:appcompat_v7是Google自己的一个兼容包或者说支持库,能够使得2.1版本以上全使用4.0的界面内容.

Android 系统服务一览表

在<Zygote进程[3]--SystemServer的诞生>一文中介绍了SystemServer的诞生,本文来看一下SystemServer中初始化的系统服务. 1.AccountManagerService Android账户服务,提供了对账户.密码.授权的集中管理. 2.AccessibilityManagerService 辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果,View的点击.焦点等事件分发管理服. 3.ActivityManagerSer

解决cocos2d-x-3.1.1新建android工程

下了个cocos2d-x-3.1.1,按照官方文档一步步配置win7下cocos2d-x-3.1.1的android开发环境,结果没有找到create_project.py这个文件.. 现将详细配置步骤称述如下; 1.下载cocos2d-x-3.1.1,解压 2.下载android ndk 3下载Apache ant 4下载python (最好不要下载3以上的,否则会出现编译错误print之类的,我下载的是2.7) 5.打开cmd  进入          cocos2d-x-3.1.1根目录,

eclipse 导入 新建 Android 项目 报错support.v7 v4

如果只是某一个工程(特别是导入的他人的工程)出问题,解决办法就是增加所缺的jar包. 步骤如下: 1.在Eclipse中,右击当前工程,选择Properties 2.选择Java Build Path 3.选择Libraries tab,点击右边面板的Add External JARs按钮 4.选择android-support-v4.jar文件,在你的andriod的sdk目录下: \android-sdks\extras\android\support\v4\android-support-

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

问题概述: 在新建Android程序的时候出现以下错误: 找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 原因: SDK不完整. 解决方法: 方法一 可在 \android-sdk-windows\tools\lib\目录下新建一个proguard.cfg文件 然后添下以下内容: proguard.cfg -optimizationpasses 5-dontusemixedcaseclassnames-dontskipnonpubliclibr

初次新建android项目时可能出现的错误

错误1:在新建android项目的时候,自动产生一个appcompat_v7项目,而且可能会报错,解决办法请参照:http://bbs.itcast.cn/thread-25953-1-1.html 错误2:资源文件夹下的png等文件,默认打开方式设置,解决办法请参照: http://zhidao.baidu.com/link?url=3Sh1v-fmz9zCU1VnJuhr-4gc_pg9peCmuaxsqI7bHkLnx-04hiCCngcvl9hC2-zvDphhDnswuuxaMnL1N

在android studio中新建android gradle project的时候connect refused:connect或者卡在building project...或Refreshing

在android studio中新建android gradle project的时候connect refused:connect或者卡在building project...或Refreshing xxx gradle project === 原因是: gradle在创建时需要联网,不然的话会失败,我虽然可以联网,但是不能访问gradle网站或者下载不了,所以不行. 感谢伟大的GFW,两种方法 1. 使用代理 --- 翻墙就可以了 - 启动XX门 - android studio -> se

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

一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是"新建android工程的时候eclipse没有自动生成MainActivity和layout布局”,项目的创建过程如下图所示: 展开HelloAndroid项目,可以看到创建好的项目的目录结构,如下图所示: 我的项目是采用的是官方集成了ADT的Eclipse(adt-bundle-windows-x8