有哪些新的 Android 系統特性
- Google Play 上的 targetVersion 要求
- 2018年8月 新應用釋出必須為26或者更高
- 2018年11月 升級現有應用必須為26或者更高
- 2019年之後 新發布或者升級應用必須為一年內釋出的 Android 版本
- 工信部已經出臺相應的政策,中國主流的應用市場也已經跟進
- Google 提供了全新的 TargetVersion 升級指南,可以掃描圖片中的二維碼獲得。
電量優化和後臺控制
Android 始終致力於電量優化和後臺控制,通過後臺控制程式程式,優化電量,進而提升待機時間,來提升使用者體驗。我們希望開發者通過下圖中的要求,來測試自己的應用,進而提升自己的應用質量。
從Android O 開始,應用可以像以前一樣,在前臺啟動服務,但是當被轉到後臺的時候,應用只有幾分鐘的時間繼續進行服務,然後,他的後臺服務就會被停止。當應用在後臺時,是不能使用 startService 來啟動服務的,會丟擲 illegalStateException 錯誤。
所以,對於開發者來說,如果你的應用需要和開發者在後臺保持互動的話,你需要按照下面的方案進行優化
- Context.startForegroundService()
- 使用
JobSchedulerWorkManager 排程後臺任務 - 使用 JobIntentService 替換 IntentService
後臺位置限制
很多開發者反應,電池耗電是應用開發過程中最不爽的因素,而後臺定位就是電池耗電的最大原因之一。如果大量使用定位,電池就會消耗很快,使用者就會禁用定位,然後你的應用體驗就會變得很差。進而會導致你的應用的一些功能失效。所以,我們在 Android O 的時候,對定位加了一定的限制。
當你的應用在前臺的時候,還是可以像往常一樣,你實時無限制的收集使用者資訊,但是,當你的應用在後收集的時候,收集速度會被限速,大概每小時會有幾次的位置更新。
對開發者來說,有以下方案可以用於優化後臺位置資訊的限制
- 使用地理圍欄 Geofence。我們對地理圍欄做了很多效率上的優化,他的延時會稍稍增加,但是功耗卻只有原來的10%。
- 使用位置批處理 LocationService.setMaxWaitTime()。這就意味著,很多資料點都會在後臺收集,然後一起返回給你。雖然你每小時只會收到幾次位置資訊,但是會包含更多的資料點。
- 被動獲取位置資訊 LocationService.setFastestInterval() 當你的應用在後臺時,前臺應用在收集位置資訊,你的應用可以被動接受前臺應用採集的資料資訊。
隱式廣播限制
這也是之前 Android 系統中存在的一個問題,隱式廣播可能會導致系統的大量服務被啟動,進而會導致系統不穩定。所以,Android O 中將不在 androidmanifest 中為隱式廣播註冊廣播接收器。具體限制可以參考下面的幾條:
- 無法在 androidmanifest 中衛隱式廣播註冊廣播接收器
- androidmanifest 中註冊的顯式廣播仍然有效
- 使用Context.registerReceiver()註冊隱式廣播接收器仍然有效
針對上面的限制,我們建議廣大開發者使用一下方法進行優化:
- 使用優先順序更高的 FCM 訊息
- 使用
JobSchedulerWorkManager 來安排一個作業
Android 的新版本將會支援更多的現代化裝置,應用也應該利用這些新的特性來提升使用者體驗,這些新的體驗我們在下面會一一介紹。
特長螢幕支援
從 Android O 開始,系統開始支援特長螢幕,很多手機廠家開始釋出特長螢幕的手機。對於廣大開發者來講,請不要對螢幕的縱橫比做出錯誤的假設。否則會影響使用者的 UI 體驗。
從 API 26 以上,系統就不會為應用設定預設的螢幕縱橫比,所以你的應用應該適應不同的螢幕尺寸,來做一些螢幕自適應的設計。
如果真的需要最大的螢幕縱橫比宣告支援的話,縱橫比應該這設定
- android:resizableActivity = false
- API 26 以上設定 android: MaxAspectRatio 宣告你所支援的最大縱橫比。
凹口螢幕支援
Android O 也對凹口螢幕進了相關的支援,應用可以在 androidmanifest 中通過一下方式實現對劉海螢幕的支援
- android:layoutInDisplayCutoutMode
- DEFAULT 有黑色邊框(螢幕縱向-僅在狀態列隱藏時)
- NEVER 一直有黑色邊框
- SHORT_EDGES 佔用凹邊周圍
- WindowInsets.getDisplayCutout()
- getSafeInset(Top|Bottom|Right|Left) 獲取內容的安全區域
- getBounds()獲取凹口區域(支援多個凹口)
- 對於開發者來說不要假設狀態列高度,應該通過模擬器多測試,模擬多種凹口屏的裝置。
畫中畫模式(PIP)
從 Android O 開始,系統開始支援畫中畫模式。畫中畫模式是一種特殊的多視窗模式,可以用來視訊聊天,播放電影,導航等場景。
當一個Activity 處於 PIP 模式,他會處於暫停狀態,但是仍然會顯示內容。出於這個原因,你應該保證你的應用不會在 onPause()中會暫停播放,正確的做法是,應用在 onStop() 的過程中暫停播放視訊,在 onStart() 的時候繼續播放。
多顯示器支援
從 Android O 開始,系統支援多顯示支援,如果 Activity 支援多顯示器顯示,系統會自動啟用多顯示器支援。當應用啟動一個 Activity 的時候,可以通過 ActivityOptions.setLaunchDisplayId() 來制定在哪個顯示器上進行顯示。每個顯示器都有自己的配置,當應用從一個顯示器到另一個顯示器的時候,Activity 會根據顯示器的配置自動修改某些屬性。需要注意的是:雖然 Activity 執行在多個顯示器上,但是仍然只有一個 Activity,不要假設暫停的 Activity 一定是不可見的。
最後,我們希望開發者能夠利用最新的開發工具,來提升應用開發效率和可靠性。 為了幫助開發者更有效,更容易的開發應用。我們在今年的 Google I/O 上推出了 Android JetPack 。其中包含了應用開發庫、工具、以及最佳實用指南。通過提供通用的基礎配件和元件,幫助開發者更好的專注於應用開發的業務邏輯。
由於時間原因,我們無法詳細的介紹每個模組的具體使用方法,請大家參考文件和例項程式碼,在應用中使用最新的 Android JetPack 元件
包名重構
所有的擴充套件類,例如 v4 和 v7 在 JetPack 中使用統一的包名 androidx。同時 gradle 也提供了相應的轉換支援。
我們下面來介紹一下 JetPack 的架構元件
架構元件提供了資料儲存、管理生命週期等模組化的功能幫助開發者避免在開發過程中的常見錯誤,減少樣板檔案。 在架構元件中,Room 是支出流暢資料庫訪問的物件對映抽象層,其他的元件的的說明可以在下面的圖片中看到
有些元件可以放在一起使用,比如:LiveData 和 Room,當 Room 中的資料有更新的時候,他就會更新 LiveData 中的資料,從而自動觸發介面中的更新。
Kotlin
我們現在也非常鼓勵開發者使用 Kotlin 程式語言,相較於 Java,Kotlin 可以減少25%的程式碼量,並且可以有效防止 NullPointerException,Kotlin 和 Java 的二進位制程式碼完全相容,可以互相呼叫,所以大家可以逐步的遷移到 Kotlin 的開發語言。
我們在 Android 9 SDK 中,對 Kotlin 新增了可控性註解,如果你的專案中違法了可控性註解的協議,你的程式碼在 IDE 中會出現警告,雖然只是警告級別,但是我們想再下個版本的 IDE 中提高錯誤等級。
從去年 Google I/O 中釋出 Kotlin 成為 Android 開發的官方語言,我們做了相關的問卷調查,在調查中我們發現,40%的開發者已經在使用 Kotlin 進行開發
JetPack 中,我們也提供了 Kotlin 的擴充套件庫 KTX,使 Kotlin 的程式碼更加簡單整潔,更符合 Android 開發習慣。KTX 可以幫助你更簡單的編寫業務的核心程式碼。
通過使用 Kotlin,開發者們也嚐到了甜頭,我們在國內的合作伙伴 Camera360,使用 Kotlin 獲得了全球業務上的增長,你們可以通過圖片中的二維碼,瞭解關於 Camera360 的開發者故事
Android Studio 3.1中也更新了許多新工具,幫助開發者更好的開發和測試 Android 應用。例如:支援 Kotlin Lint
Android Studio 3.1 中 還有很多新工具,但是由於時間關係我們無法一一做介紹,總而言之,Android Studio 3.1 提供了更好的編譯速度、更快的模擬器、更全面的分析器、更好的 Kotlin 支援和更好的架構元件的支援。歡迎開發者們在以後的開發過程中使用。