zoukankan      html  css  js  c++  java
  • Android中通过广播方式调起第三方App

    今天紧急的跟进一个百度视频App无法调起百度贴吧App的问题,当然,这个是只发现是在4.x的android系统下发生,在2.x版本下,一切正常,(其实是3.1及以上的版本都有问题)具体场景为:

    1、贴吧App安装成功但未启动,试图从视频App通过sendBroadcast方式调起:失败

    2、贴吧App的进程被用户强制杀掉,试图从视频App通过sendBroadcast方式调起:失败

    3、贴吧App处于启动状态,试图从视频App通过sendBroadcast方式调起:成功

    看了一下视频调起贴吧的代码逻辑,是这样的:

    1
    2
    3
    4
    5
    Intent intent = new Intent("com.baidu.tieba.action.INVOKE");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra("type", "frs");
    intent.putExtra("fname", "李毅");
    activity.sendBroadcast(intent);

    于是直接定位问题:必定是高版本的android系统,在发送广播的适合,无法调起未启动(处于停止状态)的的App,打开官方文档查了一下: http://developer.android.com/about/versions/android-3.1.html#launchcontrols 写的很明白,大概意思是:

    从Android 3.1开始,给Intent定义了两个新的Flag,分别为FLAG_INCLUDE_STOPPED_PACKAGESFLAG_EXCLUDE_STOPPED_PACKAGES,用来控制Intent是否要对处于停止状态的App起作用,顾名思义:

    FLAG_INCLUDE_STOPPED_PACKAGES:表示包含未启动的App

    FLAG_EXCLUDE_STOPPED_PACKAGES:表示不包含未启动的App

    值得注意的是,Android 3.1开始,系统向所有Intent的广播添加了FLAG_EXCLUDE_STOPPED_PACKAGES标志。这样做是为了防止广播无意或不必要地开启未启动App的后台服务。如果要强制调起未启动的App,后台服务或应用程序可以通过向广播Intent添加FLAG_INCLUDE_STOPPED_PACKAGES标志来唤醒,示例代码:

    1
    2
    3
    4
    5
    6
    Intent intent = new Intent("com.baidu.tieba.action.INVOKE"); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent. FLAG_INCLUDE_STOPPED_PACKAGES);
    intent.putExtra("type", "frs");
    intent.putExtra("fname", "李毅");
    activity.sendBroadcast(intent);

    如果你的项目依赖的Android SDK是3.1以下版本,那么直接像上面这样写是会出问题的,你会发现Intent.FLAG_INCLUDE_STOPPED_PACKAGES无法被正确识别,所以相对安全的办法是,直接把value写进来:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Intent intent = new Intent("com.baidu.tieba.action.INVOKE"); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    // 3.1以后的版本直接设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES的value:32
    if (android.os.Build.VERSION.SDK_INT >= 12) {
        intent.setFlags(32);
    }
    intent.putExtra("type", "frs");
    intent.putExtra("fname", "李毅");
    activity.sendBroadcast(intent);

    以上,Mark一下!

  • 相关阅读:
    牛客noip前集训营(第一场)提高T1
    约数的个数
    牛客OI赛制测试赛2 D 星光晚餐
    牛客OI赛制测试赛2 C 数组下标
    牛客OI赛制测试赛2 A 无序组数
    [题解] codevs 1486 愚蠢的矿工
    字典(trie)树--从入门到入土
    [题解] cogs 2240 架设电话线路
    [题解] cogs 1669 神秘的咒语
    LCIS 最长上升公共子序列问题
  • 原文地址:https://www.cnblogs.com/xitang/p/3472915.html
Copyright © 2011-2022 走看看