但這會出現一個問題,例如你正在用 Googlemap 來導航,但忽然彈出了一個廣告。這個行爲其實會對用戶帶來很大的困擾,用戶可能會卸載應用。android
咱們也在 Googleplay 上收到了一些用戶反饋,其中一個用戶提到,當他正在拍攝一個子女的重要時刻(畢業典禮或是孩子生日)時忽然出現了一個彈出廣告,錯過了拍攝。post
因此咱們在 Android Q 版本中加了一個新的限制:應用只有在有可見的窗口,或是響應用戶操做的時候才能夠啓動 Activity。 測試
你能夠看到,如今咱們在進行導航的時候,若是有其餘應用嘗試啓動 Activity,咱們會顯示 「toast」 以提醒開發者,他的應用不能夠在後臺啓動 Activity,須要儘快修改應用。優化
開發者必定會問:那在何時可以啓動 Activity 呢?有什麼條件呢?網站
咱們已經在官方文檔中總結了九個主要的條件:google
也就是說,你的應用是用戶正在使用的。可是有一點要注意的是,在 Activity 啓動的前提下,前臺服務不等同於該應用在前臺。3d
舉個例子,上圖中,activity Y 是暫時不在前臺的,在 foreground activity starts 的上面,但這時 activity Y 其實也是能夠啓動新的 activity 的。cdn
好比說你的應用是爲一個可見的第三方開發者提供 SDK ,而這個 SDK 綁定到你的應用的 service 上面,這時你的應用在後臺其實也是能夠啓動 activity 的。blog
例如你的應用爲第三方開發者提供 SDK,一個可見的應用發送一個 pending intent 到你的 SDK 上,這樣的狀況也是能夠啓動 activity 的。事件
可是有一個要留意的地方:若是發送的是 broadcast 或者 service 的 pending intent,你只會有幾秒鐘的時間啓動 activity,時間過了就沒法啓動。
案例 | 狀況 | 是否容許 |
---|---|---|
1 | 應用程序從通知點擊啓動UI | 容許 |
2 | 使用 AlarmManager 安排報警去發送 pending intent 來啓動 activity | 不容許 |
這個場景也須要分類:
案例 | 狀況 | 是否容許 |
---|---|---|
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 。
案例 | 狀況 | 是否容許 |
---|---|---|
1 | 你的應用程序提供了 Autofill service 的實現 | 容許 |
2 | 你使用 JobScheduler 安排工做。當系統綁定到你的 JobServicfe,你但願應用程序啓動 activity | 不容許 |
例如,若是你的應用有 Wear OS by Google的支持,能夠響應用戶在配對設備上執行的操做。好比說,user在他的手錶上作一些動做,companion APP 要彈出一個UI,在那樣的場景中是容許啓動activity的。
咱們但願開發者們能儘快注意這些方面:
1.來電處理、鬧鐘應用均可能收到影響(好比設定鬧鐘須要啓動一個鬧鐘的UI)
2.應用會進行跨設備的登錄認證
3.在後臺檢測到崩潰後會自動重啓 activity 的應用
在咱們官方文檔中有一句話:
在大部分的場景,應用均可以經過 notification 來提供用戶一些信息,讓用戶去決定要不要啓動 UI。 好比說一些時間敏感的事件,你能夠經過 notification APIs,建立一個高優先級的通知,給通知設置適當的類別。一個很重要的點是:在 notification 的時候,若是你但願它能夠做爲一個 fullscreen 的 UI 的話,我會建議加一個 setFullScreenIntent 在裏面。
固然若是是用戶正在用他的手機的時候,系統就會改爲用一個 hands-up notification 來提醒用戶那個通知。
1.最大的優勢就是不會打擾用戶,可讓用戶維持其上下文。
2.設備鎖後,設置了一個 full intent的話能夠顯示全屏UI。
3.若是用戶選擇了 「Do Not Disturb」 模式,您顯示的方式是經過 notification APIs,則您不用更改任何代碼就會遵照用戶但願的狀態
4.notification 通知設置提供更多透明度和控制。 咱們作了不少優化,好比多加了 notification channel。
最後一點就是,咱們但願全部開發者都尊重用戶正在注意的東西,不要打擾他們的使用 APIs。
測試方面,在 Q Beta1 時咱們使用一個叫許可的模式,因此在 Beta1 和 Beta2 時你能看到 toast,但 Beta3 以後再不會看到它,但咱們仍有一個 setting 可讓你暫時的去 disabled 它,叫作 allow background activity starts。若是你開了這個功能,你的應用能夠暫時從後臺啓動這個 activity,但咱們只建議在適配時使用。
若是你想了解更詳細的文檔,請進入這個網站: