Android Q 兼容那些事


文章微信公眾號「AndroidTraveler」首發

5 月 20 號參加了 Android Q Labs,因此本篇說一說會議的部分內容以及自己的一些想法。

會議主要是加深開發者對 Android Q 的了解,從而幫助開發者做好 Android Q 的兼容工作。

因此本篇我會選擇性說明一些在 Android Q 上你需要兼容的一些事情。

1. 后台 Activity 啟動限制

首先我們說說為什么要限制后台 Activity 的啟動。

Android Q 之前的情況如下:

考慮下面的幾個場景:

  1. 我在開車過程中使用導航地圖進行導航
  2. 我在使用拍照功能拍攝一個關鍵場景的視頻
  3. 我在玩游戲,比如王者榮耀,正准備團戰拿五殺的時刻
    ......

假設在上面的幾個場景中,突然后台 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM