FLAG_INCLUDE_STOPPED_PACKAGES 问题

作者: 苍风忍 | 来源:发表于2017-03-21 10:37 被阅读0次

发送重要intent时,为了确保能收到这个intent,需添加flag: FLAG_INCLUDE_STOPPED_PACKAGES。

这个flag 的注释很容易误导人,注释说,设置了这个flag后,intent可以找到当前被stopped的应用。 当没有设置FLAG_EXCLUDE_STOPPED_PACKAGES 这个flag时,默认按照 设置了FLAG_INCLUDE_STOPPED_PACKAGES 的行为进行。 如果同时设置了FLAG_EXCLUDE_STOPPED_PACKAGES 和 FLAG_INCLUDE_STOPPED_PACKAGES 时,也按照设置了FLAG_INCLUDE_STOPPED_PACKAGES 的行为进行。

If set, this intent will always match any components in packages that are currently stopped. This is the default behavior when FLAG_EXCLUDE_STOPPED_PACKAGES is not set. If both of these flags are set, this one wins (it allows overriding of exclude for places where the framework may automatically set the exclude flag).

看到注释后理所当然的认为只要不人为去添加一个FLAG_EXCLUDE_STOPPED_PACKAGES,就应该是按照设置了FLAG_INCLUDE_STOPPED_PACKAGES 的行为进行。 但是跟踪源码发现系统居然默认加了个exclude的flag,从ActivityManagerService中broadcastIntentLocked的源码看实际是添加了FLAG_EXCLUDE_STOPPED_PACKAGES:

`
private final int broadcastIntentLocked(ProcessRecord callerApp,
String callerPackage, Intent intent, String resolvedType,
IIntentReceiver resultTo, int resultCode, String resultData,
Bundle map, String requiredPermission, int appOp,
boolean ordered, boolean sticky, int callingPid, int callingUid,
int userId) {

    intent = new Intent(intent);

    // By default broadcasts do not go to stopped apps.
    intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);

    if (DEBUG_BROADCAST_LIGHT) Slog.v(
        TAG, (sticky ? "Broadcast sticky: ": "Broadcast: ") + intent
        + " ordered=" + ordered + " userid=" + userId);
    if ((resultTo != null) && !ordered) {
        Slog.w(TAG, "Broadcast " + intent + " not ordered but result callback requested!");
    }

    ...

    }

`

且android3.1的update说明中也说明系统默认为所有intent加了exclude flag。 android 3.1 release note

Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadvertently or unnecessarily launching components of stoppped applications. A background service or application can override this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications.

Applications are in a stopped state when they are first installed but are not yet launched and when they are manually stopped by the user (in Manage Applications).

这样的话如果开发者没有手动为intent加上FLAG_INCLUDE_STOPPED_PACKAGES的话,都会受到影响

相关文章

  • FLAG_INCLUDE_STOPPED_PACKAGES 问题

    发送重要intent时,为了确保能收到这个intent,需添加flag: FLAG_INCLUDE_STOPPED...

  • 问题,不是问题;问题,还是问题

    问题,不是问题 今天,是到新校舍的第一天。没水没电没床铺,教室里连黑板都没有。面对诸多问题,幸运的是...

  • 问题问题还是问题?

    问题实在是太多了!菜要这样做,不这样做是问题;饭没煮好,也是问题;自己不知道学会搞吃的也是问题;生活好像只剩下无尽...

  • 问题不是问题,如何对待问题才是问题。

    这几天身体状态一直不太好,反复头疼,但仍然坚持上课,我知道我要什么。我渴望找到那个自由绽放的自己。 早上怀着期待的...

  • “问题”不是问题,认为“是问题”才是问题

    大概从一个多星期前,腹部就开始有间断的疼痛感了,有时甚至会很难受。这种感觉在今天上午坐车时达到了最强烈,我简直不知...

  • 问题不是问题,怎样看问题才是问题。

    焦点幸福教师 坚持分享第1349天2020.11.17周二 小风波 1.购物 最近布置班级文化,我从网上购...

  • 问题的问题

    “你别总给我说问题、问题,给我提一些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结...

  • 问题的问题

    “你别总给我说问题、问题,给我提些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结果...

  • 问题不是问题!?

    创45:3-5 约瑟对他弟兄们说:“我是约瑟,我的父亲还在吗?”他弟兄不能回答,因为在他面前都惊惶。约瑟又对他弟兄...

  • 问题的问题

    问题家庭的问题是:家长本身用着有问题的方法教育孩子,没问题的孩子也变得有问题。 而且更严重的问题是:家长并没有意识...

网友评论

    本文标题:FLAG_INCLUDE_STOPPED_PACKAGES 问题

    本文链接:https://www.haomeiwen.com/subject/qcwwnttx.html