zoukankan      html  css  js  c++  java
  • 新建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的系统服务一览

  • 相关阅读:
    jq幻灯片2013-8-31
    jq设置样式
    KindEditor编辑器常用操作
    深入理解JavaScript模拟私有成员
    后台常见报错处理和注意问题(二)
    从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询
    在MySQL中使用子查询和标量子查询的基本用法
    HQL语句中数据类型转换,及hibernate中createQuery执行hql报错
    SQL中的cast()函数
    模糊搜索:concat各种函数详解、like操作符、通配符
  • 原文地址:https://www.cnblogs.com/xerrard/p/5206192.html
Copyright © 2011-2022 走看看