Android Q Labs| 後臺Activity啓動的限制

Android系統的現狀

在 Android Q 版本之前的 Android 不管在前臺後臺均可以經過調用 startActivity 來啓動。

但這會出現一個問題,例如你正在用 Googlemap 來導航,但忽然彈出了一個廣告。這個行爲其實會對用戶帶來很大的困擾,用戶可能會卸載應用。android

咱們也在 Googleplay 上收到了一些用戶反饋,其中一個用戶提到,當他正在拍攝一個子女的重要時刻(畢業典禮或是孩子生日)時忽然出現了一個彈出廣告,錯過了拍攝。post

因此咱們在 Android Q 版本中加了一個新的限制:應用只有在有可見的窗口,或是響應用戶操做的時候才能夠啓動 Activity。 測試

你能夠看到,如今咱們在進行導航的時候,若是有其餘應用嘗試啓動 Activity,咱們會顯示 「toast」 以提醒開發者,他的應用不能夠在後臺啓動 Activity,須要儘快修改應用。優化

容許 Activity Starts 的九個條件

開發者必定會問:那在何時可以啓動 Activity 呢?有什麼條件呢?網站

咱們已經在官方文檔中總結了九個主要的條件:google

1.該應用有可見的窗口,例若有一個 Activity 在前臺

也就是說,你的應用是用戶正在使用的。可是有一點要注意的是,在 Activity 啓動的前提下,前臺服務不等同於該應用在前臺。3d

2.該應用程序有一個 activity 在 foreground task stack

舉個例子,上圖中,activity Y 是暫時不在前臺的,在 foreground activity starts 的上面,但這時 activity Y 其實也是能夠啓動新的 activity 的。cdn

3.可見的應用程序綁定到應用程序的 service

好比說你的應用是爲一個可見的第三方開發者提供 SDK ,而這個 SDK 綁定到你的應用的 service 上面,這時你的應用在後臺其實也是能夠啓動 activity 的。blog

4.可見的應用程序發送該程序的 pending intent

例如你的應用爲第三方開發者提供 SDK,一個可見的應用發送一個 pending intent 到你的 SDK 上,這樣的狀況也是能夠啓動 activity 的。事件

可是有一個要留意的地方:若是發送的是 broadcast 或者 service 的 pending intent,你只會有幾秒鐘的時間啓動 activity,時間過了就沒法啓動。

5.系統發送該應用程序的pending intent

這個場景較爲複雜,須要看狀況:

案例 狀況 是否容許
1 應用程序從通知點擊啓動UI 容許
2 使用 AlarmManager 安排報警去發送 pending intent 來啓動 activity 不容許

6.系統發送broadcast到該應用程序

這個場景也須要分類:

案例 狀況 是否容許
1 你的應用具備接受 NEW_OUTGOING_CALL的broadcast receiver 容許
2 你的應用具備接受 BOOT_COMPLETED 的 broadcast receiver 不容許

須要注意的是,案例一中 NEW_OUTGOING_CALL intent 在 Q 開始以前就 broadcast這個intent。

咱們在 Android Q 版本中加了一個相對較新的 API,叫做 call redirection service,若是你的應用是用來接受 incoming call 或者是要處理一些打電話進來的狀況,咱們會建議在 Q 版本開始調用新的 APIs 。

7.系統綁定到應用程序的服務

案例 狀況 是否容許
1 你的應用程序提供了 Autofill service 的實現 容許
2 你使用 JobScheduler 安排工做。當系統綁定到你的 JobServicfe,你但願應用程序啓動 activity 不容許

8.該應用程序經過 CompanionDeviceManager APIs 與配套硬件設備相關聯

例如,若是你的應用有 Wear OS by Google的支持,能夠響應用戶在配對設備上執行的操做。好比說,user在他的手錶上作一些動做,companion APP 要彈出一個UI,在那樣的場景中是容許啓動activity的。

9.該應用程序是在 Device Owner 模式下運行的 Device Policy Controller

例如,你的應用是用來控制徹底託管的企業設備,以及數字標牌和信息亭等專用設備。若是你是 Device Owner,也是能夠在任什麼時候間啓動 activity 的。

你受影響了嗎?

咱們但願開發者們能儘快注意這些方面:

  • 您目前是否有從後臺啓動 Activity 的狀況?
  • 您的代碼庫
  • 在 Q Beta 3開始強制執行,以前版本是在許可模式下啓用,也就是說 activity 仍能夠開啓,但你會看到這樣的 toast:Backgroud activity start from som.google.android.dailer blocked.Seeg.co/dev/bgblock.

須要遷移的應用

1.來電處理、鬧鐘應用均可能收到影響(好比設定鬧鐘須要啓動一個鬧鐘的UI)

2.應用會進行跨設備的登錄認證

3.在後臺檢測到崩潰後會自動重啓 activity 的應用

緩解策略

在咱們官方文檔中有一句話:

在大部分的場景,應用均可以經過 notification 來提供用戶一些信息,讓用戶去決定要不要啓動 UI。 好比說一些時間敏感的事件,你能夠經過 notification APIs,建立一個高優先級的通知,給通知設置適當的類別。一個很重要的點是:在 notification 的時候,若是你但願它能夠做爲一個 fullscreen 的 UI 的話,我會建議加一個 setFullScreenIntent 在裏面。

固然若是是用戶正在用他的手機的時候,系統就會改爲用一個 hands-up notification 來提醒用戶那個通知。

notification APIs 的優勢

1.最大的優勢就是不會打擾用戶,可讓用戶維持其上下文。

2.設備鎖後,設置了一個 full intent的話能夠顯示全屏UI。

3.若是用戶選擇了 「Do Not Disturb」 模式,您顯示的方式是經過 notification APIs,則您不用更改任何代碼就會遵照用戶但願的狀態

4.notification 通知設置提供更多透明度和控制。 咱們作了不少優化,好比多加了 notification channel。

最後一點就是,咱們但願全部開發者都尊重用戶正在注意的東西,不要打擾他們的使用 APIs。

Android Q Beta

測試方面,在 Q Beta1 時咱們使用一個叫許可的模式,因此在 Beta1 和 Beta2 時你能看到 toast,但 Beta3 以後再不會看到它,但咱們仍有一個 setting 可讓你暫時的去 disabled 它,叫作 allow background activity starts。若是你開了這個功能,你的應用能夠暫時從後臺啓動這個 activity,但咱們只建議在適配時使用。

若是你想了解更詳細的文檔,請進入這個網站:

Android Q Labs 直播專題頁面

Android Q Labs 開場演講

Android Q 有哪些更新

Android Q 現代化您的應用

Android Q 分區存儲

Android Q 手勢導航

Jetpack 更新

Android Q 在摺疊屏設備的適配

通用系統映像介紹

Google Play 商店政策

Android Q 地理位置權限變動

Android Q 深色主題

Android Q Labs 總結演講

相關文章
相關標籤/搜索