有哪些新的 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 支持和更好的架構組件的支持。歡迎開發者們在以后的開發過程中使用。
Google 開發者大會 2018 技術干貨