Android Q 要來了,一個影響國內 90% App 的適配項!

一. Android Q 的一項適配

Android Q 在今年 Q3 就準備發佈正式版了,但有一個影響 90% 應用的適配改動。

目前,不少 Android App 都有一個啓動界面(Launch/Splash Screen),即應用啓動時,在顯示主頁前增加一個有內容的頁面,這好像變成了 App 的標配。

這種設計,最初是解決冷啓動時,會有白屏或黑屏的閃動問題,其目的是爲了提高用戶體驗。

後來發現在這個過程中,不幹點什麼好像有點浪費,那不如拿來初始化數據、SDK,再加載個廣告吧,總之,啓動頁承載的業務越來越多了。

在用戶的角度,可以看見的就是,App 啓動時,先有個啓動頁,在啓動頁加載了一個廣告,倒數 3、2、1,倒數歸零後跳到真實的主頁。這種情況下,啓動頁就承載了加載廣告的邏輯。通常的代碼實現是在廣告顯示後,增加一個倒數的定時器,在倒數歸零的時候,再去調用 startActivity() 跳轉到真實的主頁上。

有興趣可以試試,不少 App 在啓動後,立即按 Home 鍵,過 3s(廣告時間?) 之後又會被調起來。

本來呢,這種設計也是無傷大雅的,但是 Android Q 來了,就不一樣了。最近剛發佈了 Android Q Beta 4 版本,按照其時間表來看,今年第三個季度就會發布正式版。

Android Q 具有更強的隱私保護,其中有一條,它開始限制後臺 App 啓動 Activity。

以最新的 Android Q Beta 4 來舉例,當你的 App 處於後臺時,一旦嘗試開啓新的頁面,會發生什麼呢?首先你的新頁面肯定是打不開的,在現有的 Beta 版本上,系統還會輸出一條警告 Log,並彈出一條 Toast。

例如,我們開發者比較常用的 掘金App。

猜想,在正式版發佈時,應該會去掉此 Toast 警告,沒必要以這麼強的提示來提醒用戶。

但是這依然是我們需要提前做好適配準備的。畢竟在不少快速迭代的項目中,啓動速度並不是優先考慮優化的指標,各種初始化也很隨意的就放在了啓動頁裏,到最後不得不優化的時候,就比較費時和令人頭疼了。

二. MD 設計裏的啓動頁

在啓動頁裏,做大量的邏輯,甚至強制間隔幾秒(顯示廣告),這種做法本身在 Google 的設計規範就是不推薦的,不少海外大廠的 App,也是遵循此設計規範。

而國內的 App 裏,在啓動頁里加塞點功能,好像是一種更爲普遍的做法。

在 Material Design 的設計規範中,也明確定義了啓動圖的設計規範,其核心就是爲了解決冷啓動時,那個短暫的白屏不至於顯得太突兀,設計的好了,還可以增加品牌的辨識度。

啓動頁面的設計,其重點在於,它僅僅在應用啓動的瞬間顯示,也就是說,啓動頁面不應該導致應用的啓動變慢,強制顯示一段時間廣告,更是不應該的做法。

畢竟打開 App 是爲了它的功能,更快把首屏展示給用戶,體驗就更好。

三. Q 的後臺啓動建議

在 Android Q 之前的版本中,本質上就已經對一些頁面的顯示做了限制,例如 Android 8.0 增加了懸浮窗權限,其實更多的也是爲了不讓一些惡意的 App 打擾用戶。

這次 Android Q 更徹底,當前處在後臺的 App,沒有打開新頁的權限,這種設定,按照我們常規的思考,對開發者的影響應該不大,畢竟大多數時候,我們並不需要在後臺彈出一個頁面。

這不是撞上了國內較重的啓動頁設計,纔會出現問題。

針對必要的顯示,Google 也明確給出瞭解決建議,可以判斷應用在後臺時,通過向用戶發送一條通知(Notification),來由用戶決定是否開啓這個頁面。

這種解決方案,在本文這個語境中,自然是沒有什麼鳥用的,走都走了,總不能抱住用戶的大腿。

這種安全級的升級優化,我覺得按照官方的規範,適配就好了。

四. 適配思路

4.1 遵循 MD 規範

前面也提到,如果我們遵循 Material Design 的規範,只讓啓動圖,作爲一個對冷啓動的優化,瞬時展示,之後立即顯示主頁,就不會有問題。

在這個過程中,全程只有一個 Activity 參與,自然無需啓動一個新頁面,也就不會有問題。唯一需要注意的是,在 setContentView() 方法之前,別忘了修改當前頁面的 Theme。

對於現有項目,這種優化,其實我們大部分的工作,來自如何協調已經在啓動頁中的各種資源的初始化邏輯,等於之前有一個空轉的時間被利用起來初始化資源了,現在這些已經佔用的時間,沒有了。

不過也別擔心,其實有不少優秀的開源庫就在解決這些問題,例如之前推文中介紹的 Alibaba 的 Alpha 庫,就是一個基於 PERT 圖構建的 Android 異步啓動框架。

4.2 先判斷是否前臺再跳轉

正如小標題上寫的,我們可以在啓動頁跳轉到主頁時,檢測當前頁面是否在前臺,如果不在,就放棄跳轉。因爲在後臺時,並沒有打開新頁的動作,自然也不會有警告提示。

這算是一種,在現有項目基礎之上,改動最小適配方案。

此時再細化一些,在我們放棄跳轉後,可以有兩個選擇:

1. 關閉啓動頁,下次再被點擊重走啓動頁邏輯

這很好理解,把啓動頁 finish() 掉,假裝它從來沒有啓動過。下次用戶再啓動時,之前所有的步驟再走一遍,該顯示的廣告再多一次曝光。

現在有一些 App 已經是這種方案在優化。

2. 關閉啓動頁,並設置標記位

在發現啓動頁不在前臺顯示時,不做跳轉的動作,同時設置一個標誌位,但是此時不關閉當前頁面。下次啓動頁再被啓動時,直接跳轉到主頁。

如果選擇此方案,我推薦第二種細化的方案。

4.3 Activity + Fragment 的方案

此禁止的主要就是開啓新的 Activity,但是在同一個 Activity 中,使用不同的 Fragment 來承載不同的業務功能,其實是可以的。

等於是把之前的 SplashActivity,變成 SplashFragment,在主頁上先添加 SplashFragment 來完成初始化或者廣告的顯示,在顯示完成之後,移除此 SplashFragment 就好。

這種方案其實是把舊的代碼結構調整了,具體邏輯變動並不大,唯一需要注意的依然是 Theme 的切換。

五. 小結時刻

每一次新系統的發佈,或多或少都伴隨着開發者的一波適配,大多數時候,官方也會給出明確的適配方案,來幫助開發者更快適配新系統。

不過啓動頁面限制這一項,應該不在 Android 適配規範的計劃內,國內開發者還是做好提前準備。如果平時在項目迭代的時候就注意了很多代碼的規範,這些改動就相對平滑一些。

你有什麼更好的方案,歡迎在留言區討論。

Reference:

https://shoewann0402.github.io/2019/03/16/android-q-beta-background-activity-starts/

https://developer.android.google.cn/preview/privacy/background-activity-starts

本文對你有幫助嗎?留言、轉發、點好看是最大的支持,謝謝!


聯機圓桌」????推薦我的知識星球,一年 50 個優質問題,上桌聯機學習。

公衆號後臺回覆成長『成長』,將會得到我準備的學習資料,也能回覆『加羣』,一起學習進步;你還能回覆『提問』,向我發起提問。

發佈了327 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章