Android O 新特性 - Background Execution Limits

更好的閱讀體驗(yàn):https://www.zybuluo.com/zhuhf/note/680897

為了節(jié)省系統(tǒng)資源(內(nèi)存、電量、流量等)科吭,提升手機(jī)流暢度和用戶體驗(yàn),Android O 對(duì)程序“后臺(tái)運(yùn)行”的限制變得更加嚴(yán)格猴鲫,具體體現(xiàn)在兩個(gè)方面:

  • 限制后臺(tái)服務(wù)

當(dāng)我們的程序處于“空閑”狀態(tài)对人,“后臺(tái)服務(wù)”會(huì)被限制執(zhí)行,但是這不影響“前臺(tái)服務(wù)”拂共。

  • 限制廣播

程序不能在Manifest中注冊(cè)“限制性”廣播牺弄,但仍然可以動(dòng)態(tài)的去注冊(cè)。

注意:如果 targetSdkVersion <= 25宜狐,則不受以上兩個(gè)限制势告。

限制后臺(tái)服務(wù)

系統(tǒng)將一個(gè) App 分為“前臺(tái)”和“后臺(tái)”兩種狀態(tài)蛇捌。當(dāng)滿足下面任意一個(gè)條件,則認(rèn)為是“前臺(tái)” App:

  • 擁有可見(jiàn)的 Activity咱台,狀態(tài)為 started 或 paused

  • 擁有一個(gè)“foreground Service”

  • 有一個(gè)處于前臺(tái)的 App “連接”到了當(dāng)前 App络拌,一般通過(guò)“bind service” 或 “content provider”

如果以上三個(gè)條件沒(méi)有一個(gè)滿足,則認(rèn)為它是“后臺(tái)” App回溺。

當(dāng) App 在“前臺(tái)”春贸,它可以隨意的創(chuàng)建和啟動(dòng)一個(gè)“前臺(tái)”或者“后臺(tái)” Service。當(dāng) App 切換到“后臺(tái)”后遗遵,它將有一小段時(shí)間仍然可以使用 Service萍恕,在這之后 App 便會(huì)處于“空閑”狀態(tài)。這個(gè)時(shí)候车要,系統(tǒng)會(huì)停止 App 的所有“后臺(tái)” Service允粤,這就好像 App 自己調(diào)用了 Service.stopSelf() 方法。

在一些特定情況下屯蹦,“后臺(tái)” App 在一小段時(shí)間內(nèi)也可以沒(méi)有限制的使用 Service维哈。這種“特定”情況,包含以下幾種:

  • 處理 FCM 消息

這是谷歌自己的消息推送系統(tǒng)登澜,不過(guò)在國(guó)內(nèi)無(wú)法使用阔挠。

  • 接收到廣播消息,比如 SMS 信息等

  • 執(zhí)行 notification 的 PendingIntent

那么脑蠕,我們?nèi)绾谓鉀Q App “后臺(tái)”運(yùn)行時(shí)的諸多限制呢购撼?

谷歌提供了兩種建議的方案:

  • 使用 JobScheduler 替代 Service 來(lái)執(zhí)行“周期性”任務(wù)

關(guān)于 JobScheduler 的使用請(qǐng)參考這里

  • 使用“前臺(tái)” Service

Android O 之前谴仙,創(chuàng)建“前臺(tái)” Service 的步驟:

  1. 先使用 startService() 方法啟動(dòng)一個(gè) Service迂求;

  2. 然后使用 Service.startForeground() 方法將 Service 設(shè)置為“前臺(tái)” 。

這樣在通知欄就會(huì)顯示一個(gè) notification 晃跺,表明 Service 是“前臺(tái)”服務(wù)揩局。

然而,Android O 建議我們使用 NotificationManager.startServiceInForeground() 方法來(lái)創(chuàng)建一個(gè)“前臺(tái)” Service掀虎。這樣做的好處是凌盯,當(dāng) App 處于“后臺(tái)”時(shí),我們是無(wú)法使用 startService() 來(lái)創(chuàng)建 Service烹玉,但卻可以在 廣播JobScheduler 中使用 NotificationManager.startServiceInForeground() 來(lái)創(chuàng)建 Service驰怎。

限制廣播

在 Android 7.0 (API level 24) 之后,谷歌已經(jīng)對(duì)廣播做了很多限制二打,具體表現(xiàn)為:

  • targetSdkVersion >= 24县忌,Manifest 中聲明 CONNECTIVITY_ACTION 的廣播將無(wú)法收到通知。但如果是在代碼中注冊(cè),則不受此影響症杏。

  • 不能發(fā)送和接收 ACTION_NEW_PICTUREACTION_NEW_VIDEO 這兩種類型的廣播装获,這個(gè)影響所有的 App,與聲明的 targetSdkVersion 無(wú)關(guān)鸳慈。

而 Android O 讓廣播的限制變得更加嚴(yán)格饱溢,它將廣播分為“implicit”和“explicit”兩種類型。

舉個(gè)例子:

  • 如果有 App 安裝了新版本走芋,那么ACTION_PACKAGE_REPLACED將會(huì)發(fā)送給所有注冊(cè)了此廣播的 App绩郎,而不是某一個(gè)指定的 App,所以我們稱它為 “implicit”翁逞。
  • ACTION_MY_PACKAGE_REPLACED只會(huì)發(fā)送給指定的 App蔬充,所以稱它為“explicit”鸣峭。

具體限制表現(xiàn)為:

  • Android O 不允許在 Manifest 中注冊(cè)“implicit”類型的廣播,但可以注冊(cè)“explicit”類型的廣播。

  • 仍然可以在代碼中使用 Context.registerReceiver() 注冊(cè)“implicit”和“explicit”類型的廣播喳坠。

“explicit” 類型的廣播目前有以下幾種:

  • ACTION_LOCKED_BOOT_COMPLETED,
    ACTION_BOOT_COMPLETED
  • ACTION_USER_INITIALIZE
  • ACTION_TIMEZONE_CHANGED
  • CTION_LOCALE_CHANGED
  • ACTION_USB_ACCESSORY_ATTACHED, ACTION_USB_ACCESSORY_DETACHED,
    ACTION_USB_DEVICE_ATTACHED,
    ACTION_USB_DEVICE_DETACHED
  • ACTION_HEADSET_PLUG
  • ACTION_CONNECTION_STATE_CHANGED, ACTION_CONNECTION_STATE_CHANGED
  • ACTION_CARRIER_CONFIG_CHANGED
  • ACTION_DEVICE_STORAGE_LOW,
    ACTION_DEVICE_STORAGE_OK
  • LOGIN_ACCOUNTS_CHANGED_ACTION
  • ACTION_PACKAGE_DATA_CLEARED
  • ACTION_PACKAGE_FULLY_REMOVED
  • ACTION_NEW_OUTGOING_CALL
  • ACTION_DEVICE_OWNER_CHANGED
  • ACTION_EVENT_REMINDER

更多詳細(xì)信息請(qǐng)參考這里暴氏。

解決方案:

比如你有一個(gè)應(yīng)用在收到系統(tǒng)“充電廣播”的時(shí)候執(zhí)行一些清理動(dòng)作厅贪, 然而 ACTION_POWER_CONNECTED 屬于“implicit”類型廣播山涡,所以你無(wú)法在 Android O 中使用。

你可以使用以下兩個(gè)建議方案:

  • 使用 JobScheduler 來(lái)替代“特定”的廣播必怜,比如手機(jī)充電廣播: ACTION_POWER_CONNECTED
  • 使用 Context.registerReceiver() 注冊(cè)“implicit”廣播肉拓,而不是在 Manifest 中注冊(cè)

以上就是 Android O 對(duì)“后臺(tái)”運(yùn)行諸多限制的介紹,同時(shí)提供了一些建議性解決方案梳庆,希望能夠幫到大家~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暖途,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膏执,更是在濱河造成了極大的恐慌驻售,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件更米,死亡現(xiàn)場(chǎng)離奇詭異欺栗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)征峦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門纸巷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人眶痰,你說(shuō)我怎么就攤上這事√萜。” “怎么了竖伯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我七婴,道長(zhǎng)祟偷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任打厘,我火速辦了婚禮修肠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘户盯。我一直安慰自己嵌施,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布莽鸭。 她就那樣靜靜地躺著吗伤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硫眨。 梳的紋絲不亂的頭發(fā)上足淆,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音礁阁,去河邊找鬼巧号。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姥闭,可吹牛的內(nèi)容都是我干的丹鸿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼泣栈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼卜高!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起南片,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掺涛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后疼进,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體薪缆,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年伞广,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拣帽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嚼锄,死狀恐怖减拭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情区丑,我是刑警寧澤拧粪,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布修陡,位于F島的核電站,受9級(jí)特大地震影響可霎,放射性物質(zhì)發(fā)生泄漏魄鸦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一癣朗、第九天 我趴在偏房一處隱蔽的房頂上張望拾因。 院中可真熱鬧,春花似錦旷余、人聲如沸绢记。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庭惜。三九已至,卻和暖如春穗酥,著一層夾襖步出監(jiān)牢的瞬間护赊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工砾跃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骏啰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓抽高,卻偏偏與公主長(zhǎng)得像判耕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翘骂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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