android 广播 设置flag,Android 4.0新的广播机制FLAG_EXCLUDE_STOPPED_PACKAGES

问题:

第三方app调起失败,当然,这个是只发现是在4.x的android系统下发生,在2.x版本下,一切正常,(其实是3.1及以上的版本都有问题)具体场景为:

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

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

3、第三方App处于启动状态,试图从App通过sendBroadcast方式调起:成功

看了一下调起第三方app的代码逻辑,是这样的:

Intent intent = new Intent("com.hahaha.action.INVOKE");

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.putExtra("type", "frs");

intent.putExtra("fname", "hahaha");

activity.sendBroadcast(intent);

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

从Android 3.1开始,给Intent定义了两个新的Flag,分别为FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_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标志来唤醒,示例代码:

Intent intent = new Intent("com.hahaha.action.INVOKE");

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.addFlags(Intent. FLAG_INCLUDE_STOPPED_PACKAGES);

intent.putExtra("type", "frs");

intent.putExtra("fname", "hahaha");

activity.sendBroadcast(intent);

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

Intent intent = new Intent("com.hahaha.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", "hahaha");

activity.sendBroadcast(intent);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值