在Android8.0上突破隱式廣播的限制

Android O對(duì)隱式廣播進(jìn)行了限制, 其限制鏈接說明: https://developer.android.com/about/versions/oreo/background

上面所說即:若App的TargetSDK達(dá)到了26, 我們正常靜態(tài)注冊(cè)的廣播就沒有用了。能用的僅有以下豁免的Broadcast, 包括我們自己正常發(fā)廣播,如果不指定包名提澎, 靜態(tài)注冊(cè)的也是收不到的。PS:動(dòng)態(tài)注冊(cè)是沒有影響的

https://developer.android.com/guide/components/broadcast-exceptions

在我們收不到廣播的時(shí)候秽澳,系統(tǒng)會(huì)有如下打印载矿,即這個(gè)后臺(tái)的廣播接收器不會(huì)被執(zhí)行

04-21 04:12:27.513 2431 4821 W BroadcastQueue: Background execution not allowed:******************

如何應(yīng)對(duì)這一限制

知道了上面的限制后,我們正常的應(yīng)對(duì)方式為

  1. 能動(dòng)態(tài)注冊(cè)奇瘦,就不靜態(tài)注冊(cè)
  2. 如果一定要靜態(tài)注冊(cè), 發(fā)送的時(shí)候指定包名劲弦,即發(fā)送顯式廣播
  3. 如果要接收系統(tǒng)廣播耳标,而對(duì)應(yīng)的廣播在Android8.0中無法被接收,那么只能暫時(shí)把App的targetSdkVersion改為25或以下邑跪,但這招已經(jīng)不頂用了次坡,工信部要求targetSDK必須26以上

如果我們不想發(fā)顯式廣播(因?yàn)槲覀儾恢烙姓l要收廣播),對(duì)方又不能動(dòng)態(tài)注冊(cè)画畅,只能靜態(tài)注冊(cè)(許多應(yīng)用希望是被動(dòng)喚醒)砸琅,我們應(yīng)該怎么辦呢?

我們看上面的異常:

04-21 04:12:27.513 2431 4821 W BroadcastQueue: Background execution not allowed:******************

這行l(wèi)og是哪邊打印的呢轴踱?

我們?nèi)ニ阉饕幌拢?a target="_blank" rel="nofollow">http://androidxref.com/

其代碼在:frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java#1275

代碼里面有個(gè)skip變量是用來標(biāo)志是否跳過的症脂,很顯然1275行打印出來了,skip為true了那就淫僻, 我們不希望這個(gè)判斷能夠進(jìn)去诱篷。
那么如合讓判斷不進(jìn)去呢?看下面代碼雳灵。

1267                    } else if (((r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND) != 0)
1268                            || (r.intent.getComponent() == null
1269                                && r.intent.getPackage() == null
1270                                && ((r.intent.getFlags()
1271                                        & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0)
1272                                && !isSignaturePerm(r.requiredPermissions))) {
1273                        mService.addBackgroundCheckViolationLocked(r.intent.getAction(),
1274                                component.getPackageName());
1275                        Slog.w(TAG, "Background execution not allowed: receiving "
1276                                + r.intent + " to "
1277                                + component.flattenToShortString());
1278                        skip = true;
1279                    }
  1. 有這么個(gè)判斷r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND intent中攜帶了EXCLUDE_BACKGROUND標(biāo)志位肯定進(jìn)去棕所,很顯然我們正常都不帶,只有希望后臺(tái)收不到的時(shí)候才會(huì)帶悯辙。
  2. r.intent.getComponent() == null琳省, 這個(gè)肯定不會(huì)為null的。為null是必須跳過
  3. r.intent.getPackage() == null, 若包名為空笑撞,那肯定也跳過
  4. r.intent.getFlags() & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0 不能帶有FLAG_RECEIVER_INCLUDE_BACKGROUND這個(gè)標(biāo)志位岛啸,若帶了钓觉,那就進(jìn)不去了茴肥,這不就是我們希望的結(jié)果么。

那么方案有了荡灾,攜帶 FLAG_RECEIVER_INCLUDE_BACKGROUND 這個(gè)標(biāo)志位瓤狐。我們發(fā)現(xiàn)在AS中使用Intent是找不到這個(gè)標(biāo)志位的瞬铸,應(yīng)該是hide了,沒有被編譯進(jìn)SDK础锐。

看一下嗓节,果然,那么我們直接帶硬編碼即可皆警。

/**
 * If set, the broadcast will always go to manifest receivers in background (cached
 * or not running) apps, regardless of whether that would be done by default.  By
 * default they will only receive broadcasts if the broadcast has specified an
 * explicit component or package name.
 *
 * NOTE: dumpstate uses this flag numerically, so when its value is changed
 * the broadcast code there must also be changed to match.
 *
 * @hide
 */
public static final int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;

因此得出結(jié)論:發(fā)送廣播的時(shí)候攜帶intent.addFlags(0x01000000); 即能讓廣播突破隱式廣播限制拦宣。

謝謝大家的閱讀。

本文作者:Anderson/Jerey_Jobs
博客地址 : http://jerey.cn/
簡書地址 : Anderson大碼渣
github地址 : https://github.com/Jerey-Jobs

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末信姓,一起剝皮案震驚了整個(gè)濱河市鸵隧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌意推,老刑警劉巖豆瘫,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異菊值,居然都是意外死亡外驱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門腻窒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昵宇,“玉大人,你說我怎么就攤上這事定页√吮。” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵典徊,是天一觀的道長杭煎。 經(jīng)常有香客問我,道長卒落,這世上最難降的妖魔是什么羡铲? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮儡毕,結(jié)果婚禮上也切,老公的妹妹穿的比我還像新娘。我一直安慰自己腰湾,他們只是感情好雷恃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著费坊,像睡著了一般倒槐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上附井,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天讨越,我揣著相機(jī)與錄音两残,去河邊找鬼。 笑死把跨,一個(gè)胖子當(dāng)著我的面吹牛人弓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播着逐,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼崔赌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耸别?” 一聲冷哼從身側(cè)響起峰鄙,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎太雨,沒想到半個(gè)月后吟榴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡囊扳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年吩翻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锥咸。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狭瞎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搏予,到底是詐尸還是另有隱情熊锭,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布雪侥,位于F島的核電站碗殷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏速缨。R本人自食惡果不足惜锌妻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旬牲。 院中可真熱鬧仿粹,春花似錦、人聲如沸原茅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擂橘。三九已至晌区,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背契讲。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滑频,地道東北人捡偏。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像峡迷,于是被迫代替她去往敵國和親银伟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容