今天紧急的跟进一个百度视频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_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标志来唤醒,示例代码:

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一下!

转 Android中通过广播方式调起第三方App的更多相关文章

  1. Android中通过广播方式调起第三方App

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

  2. Android中的广播

    Android中的广播 广播接受器,可以比喻成收音机.而广播则可以看成电台. Android系统内部相当于已经有一个电台 定义了好多的广播事件,比如外拨电话 短信到来 sd卡状态 电池电量变化... ...

  3. Android 中的广播(Broadcast)

    Android 广播(broadcast) 饮水思源 本文章内容学习和总结自 郭霖大神:<Android第一行代码> Overview 就像我们的学校里的喇叭一样,是用来通知的.而Andr ...

  4. Android 中的广播机制

    Android 中的广播机制 Android 中的广播,按照广播响应范围,可以分为应用内广播和全局广播.按照广播的接收方式,可以分为标准广播和有序广播. 广播的分类 响应范围 应用内广播:此类广播只能 ...

  5. Android中的广播Broadcast详解

    今天来看一下Android中的广播机制,我们知道广播Broadcast是Android中的四大组件之一,可见他的重要性了,当然它的用途也很大的,比如一些系统的广播:电量低.开机.锁屏等一些操作都会发送 ...

  6. Android中的广播基本实现及回调方法的理解

    在Android中broadcast这一节的内容其实不算多主要是牵扯到一个broadcastreceiver类,这个类是一个抽象类,下面有一个抽象方法onreceiver(),可以再我们收到网络状态变 ...

  7. android中的广播接收实现总结

    1 首先根据广播应用内接收和应用外接收,分两个类进行管理[1]  LocalBroadcastManager,应用内广播管理类[2]  BroadcastManager  广播管理类(部分应用内,应用 ...

  8. Android中使用广播机制退出多个Activity

    谷歌百度一下,Android中退出多个Activity的方法,大家讨论的很多. 在实习的时候,看到公司的项目退出多个Activity,是采用LinkedList方法,毕业设计的时候,也参照了那种方法. ...

  9. Android中本地广播的实现

    其实Android的本地广播并没有什么好讲的,他就是用了一个localbroadcastmanager类来sendbroadcast,以及注册和注销广播,没有什么特点,其中实例该类的时候用了getin ...

随机推荐

  1. ACE_Event_Handler:事件响应入口

    1:ACE_Event_Handler类 头文件“Event_Handler.h” 在ACE Reactor框架中,ACE_Event_Handler是所有事件处理器的基类.ACE_Event_Han ...

  2. 学习multiprocessing(2)

    1 代码1: from multiprocessing import Pool import os, time, random def long_time_task(name): print('Run ...

  3. 《JavaScript高级程序设计》读书笔记 ---基本概念小结

     ECMAScript 中的基本数据类型包括Undefined.Null.Boolean.Number 和String. 与其他语言不同,ECMScript 没有为整数和浮点数值分别定义不同的数据 ...

  4. HDU 5798 Stabilization

    方法太厉害了....看了官方题解的做法....然后...想了很久很久才知道他想表达什么.... #pragma comment(linker, "/STACK:1024000000,1024 ...

  5. web app 基础界面框架搭建

    一.问题的产生 基础框架界面如图1所示,目前app流行布局 图1 布局关注点: 1.Title和Footer部分为固定布局position:fixed,存在的争议是android2.x和IOS4一下说 ...

  6. springsecurity源码查看网址

    http://www.boyunjian.com/javasrc/org.springframework.security/spring-security-web/3.1.3.RELEASE/_/or ...

  7. php常用命令大全

    1.php -v 查看版本号   [root@rs-2 lib]# php -v   PHP 5.5.11 (cli) (built: Apr 29 2014 12:35:52)   Copyrigh ...

  8. Python 协程/异步IO/Select\Poll\Epoll异步IO与事件驱动

    1 Gevent 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到 ...

  9. Spring 与 mybatis整合 Error parsing Mapper XML. Cause: java.lang.NullPointerException

    mapper配置文件中的namespace没有填:而且namespase的值应该填为:mapper的权限定名:否则还是会抛出异常 org.springframework.beans.factory.B ...

  10. ListView控件的Insert、Edit和Delete功能(第二部分)

    本系列文章将通过一个简单的实例,结合我自己使用ListView的情况,展示如何用ASP.NET 3.5 ListView控件进行基本的Insert.Edit和Delete操作. 系统要求: Windo ...