5 月 20 號參加了 Android Q Labs,因此本篇說一說會議的部分內容以及自己的一些想法。
會議主要是加深開發者對 Android Q 的瞭解,從而幫助開發者做好 Android Q 的相容工作。
因此本篇我會選擇性說明一些在 Android Q 上你需要相容的一些事情。
1. 後臺 Activity 啟動限制
首先我們說說為什麼要限制後臺 Activity 的啟動。
Android Q 之前的情況如下:
考慮下面的幾個場景:
- 我在開車過程中使用導航地圖進行導航
- 我在使用拍照功能拍攝一個關鍵場景的視訊
- 我在玩遊戲,比如王者榮耀,正準備團戰拿五殺的時刻
......
假設在上面的幾個場景中,突然後臺 Activity 彈出一個框,可能是廣告框,也可能是搶佔我介面的其他介面。
這個時候我覺得內心是奔潰的,而且使用者體驗超級不好。
基於此,Android Q 裡面引入了對後臺 Activity 啟動的限制。
注意關鍵的一個點是這個變化對所有在 Android Q 上執行的應用都會有影響。無論你的 targetSDK 版本。
所以如果你的 APP 存在這種場景的情況下,你就需要做一下額外處理了。
基本的處理方式是通過 Notification 彈一個通知,如果使用者想點再點選進入你的 Activity。
那麼現在有哪些 APP 會用到這種呢?舉一個大家熟悉的。
這邊測試了一下,微信語音通話是會直接從後臺啟動全屏覆蓋的,所以可能微信需要針對這個行為變更做處理。
2. 儲存的變化
先看下 Q 之前的情況:
Q 的變化分兩部分來說明吧。
一部分是 MediaStore 的處理,另一部分是分割槽儲存的處理。
先說說 MediaStore,什麼是 MediaStore 呢?
對於 MediaStore,Q 的處理如下:
可以看到對於 MediaStore,可以直接寫,讀的話僅僅限於自己寫進去的檔案。如果要檢視其它應用提供的內容,需要獲取讀許可權。
另外你會發現 MediaStore 上面只有媒體相關的,如果檔案是非媒體型別呢?所以 Q 新增 MediaStore.Downloads,如下:
總結起來如下:
許可權的變更:在沒解除安裝的情況下,自己 APP 寫或者讀 MediaStore 媒體檔案不需要許可權。讀其他的需要許可權。解除安裝後讀自己之前寫入的也需要許可權。
另外還有一個就是圖片有一個位置資訊,這個對使用者來說也是隱私,因此需要做額外處理。
說完了 MediaStore,接下來說說分割槽儲存。
總結起來就是分割槽儲存模式下,不能夠再直接訪問 /sdcard 下的檔案,而要通過 MediaStore 或者 SAF。當然自己 packagename 命名的目錄下面還是可以訪問的。
另外目前可以通過在清單檔案設定是否啟用。可以設定 targetSDK 為 Q 的應用不啟用,也可以設定 targetSDK 低於 Q 的啟用。通過程式碼可以確認是否處於分割槽儲存模式下。
推薦儘快完成適配,因為目前是為了給開發者更多時間適應這個變化,等到下一個版本 Android R 的時候會強制執行分割槽儲存模式,到時候清單檔案的設定也是沒用的。因此強烈建議將這個工作排上相容行程。當然在 Q 的相容上可以根據自身業務進度進行設定,假設時間不夠,可以暫時不啟用,但是後續需要排期處理。
3. 位置許可權
我們看看 Android P 申請位置許可權的對話方塊:
可以看到只有允許和拒絕兩個選項。
現在看看 Android Q 的:
會發現多了一些選項,其中有一個僅在使用該應用時允許。
在 Android P 的時候,清單檔案只需要申請一個許可權:
而在 Q 上面,有兩個,其中一個有 background 的。
之所以有兩個,就是希望儘量少的獲取許可權,除非是你的 APP 真的有這個需求。在申請的時候也建議增量申請,什麼意思呢?
首先第一步先獲取位置許可權:
在使用者允許的情況下,如果 APP 需要,再進行增量許可權請求:
推薦的位置許可權最佳實踐如下:
4. 深色主題
Q 支援深色主題,相容有兩種方式。
一種就是簡單粗暴,適合時間少的。
一種就是推薦的,適合有足夠時間的。
簡單的方式如果是全域性設定,只需要設定主題即可:
如果你需要對單個 View 做設定,也是可以的:
推薦的方式是使用 DayNight。
不過我在測試區啟動深色主題時發現有點卡,估計後面系統還需要優化。
5. BubbleView 和指紋識別
BubbleView 其實就是懸浮窗。指紋識別也是 Android Q 引入的一個官方方式。
這個不需要做相容,算是新功能,這裡不贅述。
6. Kotlin vs Flutter
其實在程式碼演示的時候,我注意到 PPT 上面的程式碼基本都是 Kotlin。
包括之前的 Kotlin-first 以及這次 Q & A 環節也有小夥伴提問到底 Google 主推 Kotlin 還是 Flutter。
我這邊說下我的看法吧。
我覺得 Kotlin 和 Flutter 不衝突。
首先第一個 Kotlin 是一門語言,而 Flutter 是一個跨平臺方案。
如果你的 APP 有跨平臺的需求,或者有很多頁面需要開發,人手不足,功能迭代比較頻繁,那麼你可以瞭解或者嘗試使用 Flutter 來開發介面。一套程式碼,兩端執行。尤其 Flutter 1.5 佈局很廣,涵蓋了移動端、Web、桌面端和嵌入式。
對於 Android 開發者,可以看我的 Flutter 即學即用系列部落格快速入門。
說完了 Flutter,說下 Kotlin 吧。
Kotlin 是一門語言,語言是幹嘛的?是實現我們業務的工具。
假設現在 Java 和 Kotlin 都可以實現我們的業務功能,並且官方都支援這兩種語言,你有必要花很多時間去單獨學習 Kotlin 嗎?我覺得沒太大必要。
所以我覺得對待 Kotlin 你可以瞭解一下,能夠看懂 Kotlin 程式碼,會寫簡單的 Demo,我覺得就夠了。
當然如果你時間足夠,想多學一門語言,完全沒問題。
以上是參加這次會議的一些簡單總結和看法,更多內容通過下面的全程錄影瞭解。
本次 Android Q Labs 全程錄影可以通過連結觀看:Android Q Labs