当前位置:首页 » 《随便一记》 » 正文

Android C++语言 通过Binder通信调用activity: [android.app.IActivityManager] 服务发广播_海月汐辰

2 人参与  2022年04月26日 17:24  分类 : 《随便一记》  评论

点击全文阅读


一、这里拿电池温度警告框的例子来学习一下C++语言 通过Binder通信调用activity: [android.app.IActivityManager] 服务发广播。

二、vendor\mediatek\proprietary\frameworks\opt\batterywarning\batterywarning.cpp 发广播的地方。

bool sendBroadcastMessage(String8 action, int value)
{
    ALOGD("sendBroadcastMessage(): Action: %s, Value: %d ", (char *)(action.string()), value);
    sp<IServiceManager> sm = defaultServiceManager();
    sp<IBinder> am = sm->getService(String16("activity"));
    if (am != NULL) {
        Parcel data, reply;
        data.writeInterfaceToken(String16("android.app.IActivityManager"));
        data.writeStrongBinder(NULL);
        // Add for match AMS change on O
        data.writeInt32(1);
        // intent begin
        data.writeString8(action); // action
        data.writeInt32(0); // URI data type
        data.writeString8(NULL, 0); // type
        data.writeString8(NULL, 0); // mIdentifier
        data.writeInt32(0x04000000); // flags: FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
        data.writeString8(NULL, 0); // package name
        data.writeString8(NULL, 0); // component name
        data.writeInt32(0); // source bound - size
        data.writeInt32(0); // categories - size
        data.writeInt32(0); // selector - size
        data.writeInt32(0); // clipData - size
        data.writeInt32(-2); // contentUserHint: -2 -> UserHandle.USER_CURRENT
        data.writeInt32(-1); // bundle extras length
        data.writeInt32(0x4C444E42); // 'B' 'N' 'D' 'L'
        int oldPos = data.dataPosition();
        data.writeInt32(1);  // size
        // data.writeInt32(0); // VAL_STRING, need to remove because of analyze common intent
        data.writeString16(String16(TYPE));
        data.writeInt32(1); // VAL_INTEGER
        data.writeInt32(value);
        int newPos = data.dataPosition();
        data.setDataPosition(oldPos - 8);
        data.writeInt32(newPos - oldPos); // refill bundle extras length
        data.setDataPosition(newPos);
        // intent end
        data.writeString8(NULL, 0); // resolvedType
        data.writeStrongBinder(NULL); // resultTo
        data.writeInt32(0); // resultCode
        data.writeString8(NULL, 0); // resultData
        data.writeInt32(-1); // resultExtras
        data.writeString8(NULL, 0); // permission
        data.writeInt32(0); // appOp
        data.writeInt32(-1); // option
        data.writeInt32(1); // serialized: != 0 -> ordered
        data.writeInt32(0); // sticky
        data.writeInt32(-2); // userId: -2 -> UserHandle.USER_CURRENT

        status_t ret = am->transact(IBinder::FIRST_CALL_TRANSACTION + 13, data, &reply); // BROADCAST_INTENT_TRANSACTION
        if (ret == NO_ERROR) {
            int exceptionCode = reply.readExceptionCode();
            if (exceptionCode) {
                ALOGE("sendBroadcastMessage(%s) caught exception %d\n",
                        (char *)(action.string()), exceptionCode);
                return false;
            }
        } else {
            return false;
        }
    } else {
        ALOGE("getService() couldn't find activity service!\n");
        return false;
    }
    return true;
}

 三、从上面可以知道会调用一个activity服务,adb shell service list查看系统的service。

 四、那这个service哪里来的呢?咱们一步一步来分析一些吧。

        4、1 服务文件frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java

         4、2  frameworks\base\core\java\android\app\IActivityManager.aidl 文件

         4、3 开启服务

               frameworks\base\services\java\com\android\server\SystemServer.java里面调用setSystemProcess打开服务。

 

 

          4、4 看一下setSystemProcess的内容,   public static final String ACTIVITY_SERVICE = "activity";

          4、5 到这里就可以知道服务名是activity: [android.app.IActivityManager]是如何而来的了。

四、上面提到status_t ret = am->transact(IBinder::FIRST_CALL_TRANSACTION + 13, data, &reply); // BROADCAST_INTENT_TRANSACTION

这个会调用哪个函数呢?上面的13是如何而来的呢?这个得分析一下frameworks\base\core\java\android\app\IActivityManager.aidl,可以知道    int broadcastIntent(in IApplicationThread caller, in Intent intent,
            in String resolvedType, in IIntentReceiver resultTo, int resultCode,
            in String resultData, in Bundle map, in String[] requiredPermissions,
            int appOp, in Bundle options, boolean serialized, boolean sticky, int userId);对应第13项。仔细观察会发现transact后面的data参数跟broadcastIntent是对应的,这个是调用的核心的。

 


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/39014.html

调用  服务  而来  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 好看的秦依冉厉泽谦_秦依冉厉泽谦
  • 是图图的拥有牡丹命格的我嫁给五皇子,抛弃我的太子谢怀川,余思思,楼心月全书在线
  • 全文老婆成***后,王牌拆弹专家(张凯,张振华,林蕴)列表_全文老婆成***后,王牌拆弹专家
  • 逼我下乡?我闪婚嫁军官带娃暴富苏冉冉刘翠芬周牧深完本_逼我下乡?我闪婚嫁军官带娃暴富(苏冉冉刘翠芬周牧深)
  • 童养夫为了白月光想虐我?没关系我还有九个(崔清乐顾北寒)_童养夫为了白月光想虐我?没关系我还有九个(崔清乐顾北寒)
  • 代管班费小荷包三年后,青梅说我吞了180万(乔宇宁雨)全书免费_(乔宇宁雨)代管班费小荷包三年后,青梅说我吞了180万后续(乔宇宁雨)
  • 男友一家要我守规矩后,却悔疯了苏然完本_男友一家要我守规矩后,却悔疯了(苏然)
  • 重生打脸渣男毒闺蜜(陈亮张倩)全书免费_(陈亮张倩)重生打脸渣男毒闺蜜后续(陈亮张倩)
  • 全文和宗门断情绝义后,小可怜被大佬团宠了创作编写(江寻柳青青)列表_全文和宗门断情绝义后,小可怜被大佬团宠了创作编写
  • 和宗门断情绝义后,小可怜被大佬团宠了创作编写江寻柳青青完本_和宗门断情绝义后,小可怜被大佬团宠了创作编写(江寻柳青青)
  • 向导坐牢后,结果把狱友驯成忠犬桑虞陆擢完本_向导坐牢后,结果把狱友驯成忠犬(桑虞陆擢)
  • 姑姑爱开玩笑,藏我的录取通知书夏知妤_姑姑爱开玩笑,藏我的录取通知书夏知妤

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1