后臺執(zhí)行限制:
Android 8.0對應用后臺執(zhí)行做了限制,已節(jié)省內存等飞苇,達到更好的用戶體驗。下面面一段我們看一下官方解釋文檔的說法:
應用在兩個方面受到限制:
后臺服務限制:處于空閑狀態(tài)時,應用可以使用的后臺服務存在限制访惜。 這些限制不適用于前臺服務宦芦,因為前臺服務更容易引起用戶注意宙址。
廣播限制:除了有限的例外情況,應用無法使用清單注冊隱式廣播调卑。 它們仍然可以在運行時注冊這些廣播抡砂,并且可以使用清單注冊專門針對它們的顯式廣播。
注:默認情況下恬涧,這些限制僅適用于針對 O 的應用注益。 不過,用戶可以從Settings屏幕為任意應用啟用這些限制溯捆,即使應用并不是以 O 為目標平臺丑搔。
后臺服務限制:
我們再仔細的看一下官網所提的后臺服務:
系統(tǒng)可以區(qū)分前臺和后臺應用。(用于服務限制目的的后臺定義與內存管理使用的定義不同;一個應用按照內存管理的定義可能處于后臺啤月,但按照能夠啟動服務的定義又處于前臺煮仇。)如果滿足以下任意條件,應用將被視為處于前臺:
具有可見 Activity(不管該 Activity 已啟動還是已暫停)谎仲。
具有前臺服務欺抗。
另一個前臺應用已關聯到該應用(不管是通過綁定到其中一個服務,還是通過使用其中一個內容提供程序)强重。
例如绞呈,如果另一個應用綁定到該應用的服務,那么該應用處于前臺间景。
1.再次注意限制條件:后臺服務(仔細看上面的條件)佃声;
2.當應用出于后臺一段時間(測試Oreo模擬器一分多一點)內,已經啟動的Service可以運行倘要。超過這個時間stop執(zhí)行圾亏,也就是說被系統(tǒng)殺掉了;
3.當應用處于后臺一段時間(測試使用120s作為測試)封拧,再startService啟動后臺Service報錯()志鹃;
note:
1.在3條件下bindService不會有以上問題;
2.可以通過startForegroundService(new Intent(getApplicationContext(), MyService.class));并且5s內沒使用startForeground()來創(chuàng)建一個notification通知泽西,Service會stop;
3.另外官網推薦使用JobScheduler作業(yè)替換后臺服務曹铃;
廣播限制:
Oreo不再允許在注冊列表注冊隱式廣播接收器(白名單中的類型除外、需要簽名權限的廣播也例外捧杉、運行時Context.registerReceiver()不被限制)陕见;
另外官方推薦許多情況下,之前注冊隱式廣播的應用使用JobScheduler作業(yè)可以獲得類似的功能味抖。
白名單廣播類型:
ACTION_LOCKED_BOOT_COMPLETED,ACTION_BOOT_COMPLETED
ACTION_USER_INITIALIZE,"android.intent.action.USER_ADDED", "android.intent.action.USER_REMOVED"
"android.intent.action.TIME_SET",ACTION_TIMEZONE_CHANGED,ACTION_NEXT_ALARM_CLOCK_CHANGED
ACTION_USB_ACCESSORY_ATTACHED,ACTION_USB_ACCESSORY_DETACHED,ACTION_USB_DEVICE_ATTACHED,ACTION_USB_DEVICE_DETACHED
ACTION_CONNECTION_STATE_CHANGED,ACTION_CONNECTION_STATE_CHANGED,ACTION_ACL_CONNECTED,ACTION_ACL_DISCONNECTED
ACTION_CARRIER_CONFIG_CHANGED,TelephonyIntents.ACTION_*_SUBSCRIPTION_CHANGED, "TelephonyIntents.SECRET_CODE_ACTION"
ACTION_MEDIA_MOUNTED,ACTION_MEDIA_CHECKING,ACTION_MEDIA_UNMOUNTED,ACTION_MEDIA_EJECT,ACTION_MEDIA_UNMOUNTABLE,ACTION_MEDIA_REMOVED,ACTION_MEDIA_BAD_REMOVAL