• 【Android开发】Android服务和系统服务


    Android中的服务和系统服务

    • Android服务:一个后台运行的组件,执行长时间运行且不需要用户交互的任务。在Android开发中作为一个应用组件,通过继承类extern Service来使用。

    • Android系统服务:随着Andorid系统启动运行的service,分为Java系统服务和Native系统服务。

    添加Java系统服务

    http://qiushao.net/2019/12/20/Android%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8/7-%E6%B7%BB%E5%8A%A0java%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1/

    1. 使用 aidl 定义服务接口
      编写IHelloService.aidl,
      执行 mm -j 命令编译 framework.jar 模块
      编译成功后会生成IHelloService.java 这个文件

    2. 实现接口
      实现 HelloService.java 文件

    3. 将服务添加到 ServiceManager
      修改 SystemServer.java 文件,在 startOtherServices 方法里面增加代码

    4. 设置selinux 规则

    5. 编译验证

    6. 客户端调用

    import android.pure.IHelloService;
    ……
    service = IHelloService.Stub.asInterface(ServiceManager.getService("HelloService"));
    
    • 1
    • 2
    • 3

    添加Native系统服务

    http://qiushao.net/2019/12/29/Android%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8/9-%E6%B7%BB%E5%8A%A0native%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1/

    上一小节是Java层系统服务的实现方式。有时候出于性能方面的考虑,有些服务是需要使用 C++ 来实现的,比如音视频编解码,图形绘制等。 Android 系统原生的 MediaPlayerService 和 SurfaceFlinger 就是使用 c++ 实现的 Native 系统服务。

    1. 声明服务接口
      编写HelloNativeService.h
    class HelloNativeService: public BBinder {
    public:
        HelloNativeService();
        static int instantiate();
        virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);
    
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 实现服务功能
      创建文件 HelloNativeService.cpp
    #include "HelloNativeService.h"
    
    static void sayHello(const char *name) {
        LOGD("hello %s from HelloNativeService", name);
    }
    
    static int sum(int a, int b) {
        return a + b;
    }
    
    HelloNativeService::HelloNativeService() {
        LOGD("HelloNativeService created");
    }
    
    status_t HelloNativeService::onTransact(uint32_t code, const Parcel &request, Parcel *reply, uint32_t flag) {
        switch (code) {
            case CMD_SAY_HELLO:
                sayHello(request.readCString());
                return NO_ERROR;
    
            case CMD_CAL_SUM:
                int a = request.readInt32();
                int b = request.readInt32();
                reply->writeInt32(sum(a, b));
                return NO_ERROR;
        }
        return BBinder::onTransact(code, request, reply, flag);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • code : 表示要执行的动作,类似Handler发送的Message的what。code指示了当前远程操作的命令,IBinder定义了像INTERFACE_TRANSACTION、PING_TRANSACTION 这样的几个通用命令。自己使用的命令的标识值需要在FIRST_CALL_TRANSACTION和LAST_CALL_TRANSACTION之间。
    • request, reply : request 和 reply 参数相当于普通函数里的调用参数和返回值。Parcel类型是可以跨进程的数据。
    • flag : 参数 flags 只有 0 和 FLAG_ONEWAY 两种。0 表示阻塞调用, FLAG_ONEWAY 表示异步调用。这个参数不需要我们在服务端处理, Binder 框架会自动处理。
    1. 添加 main.cpp
      前面我们定义了服务接口而已,这个服务也是需要依赖在某个进程才能运行的

    2. 编写Android.bp

    3. 设置selinux 规则

    4. 设置开机自动运行

    5. 编写 client 调用服务

    6. 编译运行


    参考:https://bbs.huaweicloud.com/blogs/311242

  • 相关阅读:
    MySQL学习笔记-4.数据更新时的性能问题
    文字轮播与图片轮播?CSS 不在话下
    产品经理视角 | API接口知识小结
    人工智能时代,数据分析如何帮助预测业务未来?
    python第三方库-字符串编码工具 chardet 的使用(python3经典编程案例)
    Web服务器和PHP解释器
    Canvas下画仪表盘,结合设计好的表盘背景
    Mybatis 插件使用及源码分析
    学习Java Web开发的关键技术和概念
    Python基于词袋模型特征和TFIDF特征进行支持向量机模型中文邮件分类项目实战
  • 原文地址:https://blog.csdn.net/qq_39441603/article/details/133861072