Android 8.0 除了提供諸多新特性和功能外,還對系統和 API 行爲做出了各種變更。本文重點介紹您應該瞭解並在開發應用時加以考慮的一些主要變更。
其中大部分變更會影響所有應用,而不論應用針對的是何種版本的 Android。不過,有幾項變更僅影響針對 Android 8.0 的應用。爲清楚起見,本頁面分爲兩個部分:針對所有 API 級別的應用和針對 Android 8.0 的應用。
針對所有API級別的應用
後臺執行限制
Android 8.0 爲提高電池續航時間而引入的變更之一是,當您的應用進入已緩存狀態時,如果沒有活動的組件,系統將解除應用具有的所有喚醒鎖。
此外,爲提高設備性能,系統會限制未在前臺運行的應用的某些行爲。具體而言:
- 現在,在後臺運行的應用對後臺服務的訪問受到限制。
- 應用無法使用其清單註冊大部分隱式廣播(即,並非專門針對此應用的廣播)。
默認情況下,這些限制僅適用於針對 O 的應用。不過,用戶可以從 Settings 屏幕爲任意應用啓用這些限制,即使應用並不是以 O 爲目標平臺。
Android 8.0 還對特定函數做出了以下變更:
- 如果針對 Android 8.0 的應用嘗試在不允許其創建後臺服務的情況下使用
startService()
函數,則該函數將引發一個IllegalStateException
。 - 新的
Context.startForegroundService()
函數將啓動一個前臺服務。現在,即使應用在後臺運行,系統也允許其調用Context.startForegroundService()
。不過,應用必須在創建服務後的五秒內調用該服務的startForeground()
函數。
如需瞭解詳細信息,請參閱後臺執行限制。
android 後臺位置限制
爲節約電池電量、保持良好的用戶體驗和確保系統健康運行,在運行 Android 8.0 的設備上使用後臺應用時,降低了後臺應用接收位置更新的頻率。此行爲變更會影響包括 Google Play 服務在內的所有接收位置更新的應用。
此類變更會影響以下 API:
- Fused Location Provider (FLP)
- Geofencing
- GNSS Measurements
- Location Manager
- Wi-Fi Manager
爲確保您的應用按預期方式運行,請完成以下步驟:
- 查看您的應用的邏輯,並確保您使用的是最新的位置 API。
- 測試您的應用是否在每個用例中都表現出預期行爲。
- 考慮使用 Fused Location Provider (FLP) 或地理圍欄來處理依賴於用戶當前位置的用例。
如需瞭解此類變更的詳細信息,請參閱後臺位置限制。
提醒窗口
如果應用使用 SYSTEM_ALERT_WINDOW
權限並且嘗試使用以下窗口類型之一來在其他應用和系統窗口上方顯示提醒窗口:
...那麼,這些窗口將始終顯示在使用 TYPE_APPLICATION_OVERLAY
窗口類型的窗口下方。如果應用針對的是 Android 8.0,則應用會使用 TYPE_APPLICATION_OVERLAY
窗口類型來顯示提醒窗口。
如需瞭解詳細信息,請參閱針對 Android 8.0 的應用的行爲變更內的提醒窗口的常用窗口類型部分。
聯繫人提供程序使用情況統計方法的變更
在之前版本的 Android 中,聯繫人提供程序組件允許開發者獲取每個聯繫人的使用情況數據。此使用情況數據揭示了與某個聯繫人相關聯的每個電子郵件地址和每個電話號碼的信息,包括與該聯繫人聯繫的次數以及上次聯繫該聯繫人的時間。請求 READ_CONTACTS
權限的應用可以讀取此數據。
如果應用請求 READ_CONTACTS
權限,它們仍可以讀取此數據。從 Android 8.0 開始,使用情況數據查詢會返回近似值,而不是精確值。不過,Android 系統內部仍然會保留精確值,因此,此變更不會影響 auto-complete API。
此行爲變更會影響以下查詢參數:
針對android 8.0的應用
這些行爲變更專門應用於針對 O 平臺或更高平臺版本的應用。針對 Android 8.0 或更高平臺版本進行編譯,或將 targetSdkVersion
設爲 Android 8.0 或更高版本的應用開發者必須修改其應用以正確支持這些行爲(如果適用)。
提醒窗口
使用 SYSTEM_ALERT_WINDOW
權限的應用無法再使用以下窗口類型來在其他應用和系統窗口上方顯示提醒窗口:
相反,應用必須使用名爲 TYPE_APPLICATION_OVERLAY
的新窗口類型。
使用 TYPE_APPLICATION_OVERLAY
窗口類型顯示應用的提醒窗口時,請記住新窗口類型的以下特性:
- 應用的提醒窗口始終顯示在狀態欄和輸入法等關鍵系統窗口的下面。
- 系統可以移動使用
TYPE_APPLICATION_OVERLAY
窗口類型的窗口或調整其大小,以改善屏幕顯示效果。 - 通過打開通知欄,用戶可以訪問設置來阻止應用顯示使用
TYPE_APPLICATION_OVERLAY
窗口類型顯示的提醒窗口。
視圖焦點
可點擊的 View
對象現在默認也可以成爲焦點。如果您希望 View
對象可點擊但不可成爲焦點,請在包含 View
的佈局 XML 文件中將 android:focusable
屬性設置爲 false
,或者將 false
傳遞至應用界面邏輯中的 setFocusable()
。
賬號訪問和可檢測性
除非身份驗證器擁有用戶帳號或用戶授予訪問權限,否則,應用將無法再訪問用戶帳號。僅擁有 GET_ACCOUNTS
權限尚不足以訪問用戶帳號。要獲得帳號訪問權限,應用應使用 AccountManager.newChooseAccountIntent()
或特定於身份驗證器的函數。獲得帳號訪問權限後,應用可以調用 AccountManager.getAccounts()
來訪問帳號。
Android 8.0 已棄用 LOGIN_ACCOUNTS_CHANGED_ACTION
。相反,應用在運行時應使用 addOnAccountsUpdatedListener()
獲取帳號更新信息。
有關新增 API 和增加的帳號訪問和可檢測性函數的信息,請參閱此文檔的“新增 API”部分中的帳號訪問和可檢測性。
權限
在 Android 8.0 之前,如果應用在運行時請求權限並且被授予該權限,系統會錯誤地將屬於同一權限組並且在清單中註冊的其他權限也一起授予應用。
對於針對 Android 8.0 的應用,此行爲已被糾正。系統只會授予應用明確請求的權限。然而,一旦用戶爲應用授予某個權限,則所有後續對該權限組中權限的請求都將被自動批准。
例如,假設某個應用在其清單中列出 READ_EXTERNAL_STORAGE
和 WRITE_EXTERNAL_STORAGE
。應用請求 READ_EXTERNAL_STORAGE
,並且用戶授予了該權限。如果該應用針對的是 API 級別 24 或更低級別,系統還會同時授予 WRITE_EXTERNAL_STORAGE
,因爲該權限也屬於同一 STORAGE
權限組並且也在清單中註冊過。如果該應用針對的是 Android 8.0,則系統此時僅會授予 READ_EXTERNAL_STORAGE
;不過,如果該應用後來又請求 WRITE_EXTERNAL_STORAGE
,則系統會立即授予該權限,而不會提示用戶。
參考文檔
https://developer.android.com/about/versions/oreo/android-8.0-changes