Android Q適配(4)-------針對(duì)后臺(tái) Activity 啟動(dòng)的限制

前言

AndroidQ加強(qiáng)了關(guān)于后臺(tái)Activity的啟動(dòng)限制,App不可以隨意的從后臺(tái)拉起Activity,這里對(duì)Google官方文檔進(jìn)行一轉(zhuǎn)載,不進(jìn)行過(guò)多的改動(dòng),原文鏈接:https://developer.android.com/preview/privacy/background-activity-starts

正文

從 Android Q 測(cè)試版 1 開(kāi)始,此項(xiàng)變更具有以下特性:

  • 如果您在未與用戶(hù)互動(dòng)的情況下啟動(dòng) Activity,則會(huì)影響您的應(yīng)用
  • 使用由通知觸發(fā)的 Activity 進(jìn)行緩解
  • 通過(guò)關(guān)閉允許系統(tǒng)執(zhí)行后臺(tái)活動(dòng)開(kāi)發(fā)者選項(xiàng)來(lái)啟用限制

Android Q 對(duì)應(yīng)用可啟動(dòng) Activity 的時(shí)間施加了限制。此項(xiàng)行為變更有助于最大限度地減少對(duì)用戶(hù)造成的中斷,并且可以讓用戶(hù)更好地控制其屏幕上顯示的內(nèi)容。具體而言,在 Android Q 上運(yùn)行的應(yīng)用只有在滿(mǎn)足以下一個(gè)或多個(gè)條件時(shí)才能啟動(dòng) Activity:

  1. 該應(yīng)用具有可見(jiàn)窗口,例如在前臺(tái)運(yùn)行的 Activity。
  2. 在前臺(tái)運(yùn)行的另一個(gè)應(yīng)用會(huì)發(fā)送屬于該應(yīng)用的 PendingIntent。示例包括發(fā)送菜單項(xiàng)待定 intent 的自定義標(biāo)簽頁(yè)提供程序。
  3. 系統(tǒng)發(fā)送屬于該應(yīng)用的 PendingIntent,例如點(diǎn)按通知。只有應(yīng)用應(yīng)啟動(dòng)界面的待定 intent 才可以免除。
  4. 系統(tǒng)向應(yīng)用發(fā)送廣播,例如 SECRET_CODE_ACTION。只有應(yīng)用應(yīng)啟動(dòng)界面的特定廣播才可以免除。

注意:出于 Activity 啟動(dòng)的目的,前臺(tái)服務(wù)不會(huì)將應(yīng)用限定為在前臺(tái)運(yùn)行。

此項(xiàng)行為變更適用于在 Android Q 上運(yùn)行的所有應(yīng)用,包括以 Android 9(API 級(jí)別 28)或更低版本為目標(biāo)平臺(tái)的應(yīng)用。此外,即使您的應(yīng)用以 Android 9 或更低版本為目標(biāo)平臺(tái)并且最初安裝在運(yùn)行 Android 9 或更低版本的設(shè)備上,該行為變更仍會(huì)在設(shè)備升級(jí)到 Android Q 后生效。

但是,只要您的應(yīng)用啟動(dòng) Activity 是因用戶(hù)互動(dòng)直接引發(fā)的,該應(yīng)用就極有可能不會(huì)受到此項(xiàng)變更的影響。實(shí)際上,大多數(shù)應(yīng)用都不會(huì)受到此項(xiàng)變更的影響。如果您發(fā)現(xiàn)自己的應(yīng)用受到了影響,請(qǐng)向我們發(fā)送反饋。

警告消息

在測(cè)試版 1 中,如果您的應(yīng)用在 Android Q 上運(yùn)行并嘗試從后臺(tái)啟動(dòng) Activity,則平臺(tái)允許該 Activity 啟動(dòng),但它會(huì)向 logcat 發(fā)送警告消息并顯示以下警告提示消息:

This background activity start from package-name will be blocked in future Q builds.

與 Android Q 中在后臺(tái)啟動(dòng) Activity 相關(guān)的限制與系統(tǒng)在設(shè)備進(jìn)入固定屏幕狀態(tài)后阻止 Activity 啟動(dòng)的方式類(lèi)似。

針對(duì)有時(shí)效性的事件創(chuàng)建通知

幾乎在所有情況下,后臺(tái)應(yīng)用都應(yīng)創(chuàng)建通知以便向用戶(hù)提供信息,而不是直接啟動(dòng) Activity。

在特定情況下,您的應(yīng)用可能需要立即引起用戶(hù)的注意,例如鬧鐘正在響鈴或有來(lái)電時(shí)。您可能已出于此目的將應(yīng)用配置為啟動(dòng)后臺(tái) Activity。要在運(yùn)行 Android Q 的設(shè)備上提供相同的行為,請(qǐng)完成以下各部分中所示的步驟。

創(chuàng)建高優(yōu)先級(jí)通知

創(chuàng)建通知時(shí),請(qǐng)務(wù)必添加描述性標(biāo)題和消息,并視需要選擇提供全屏 intent。

以下代碼段中顯示了示例通知:

val fullScreenIntent = Intent(this, CallActivity::class.java)    
val fullScreenPendingIntent = PendingIntent.getActivity(this, 0,        
fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT)     
val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)        
.setSmallIcon(R.drawable.notification_icon)        
.setContentTitle("Incoming call")       
.setContentText("(919) 555-1234")        
.setPriority(NotificationCompat.PRIORITY_HIGH)        
.setCategory(NotificationCompat.CATEGORY_CALL)         
// Use a full-screen intent only for the highest-priority alerts where you        
// have an associated activity that you would like to launch after the user       
// interacts with the notification. Also, if your app targets Android Q, you        
// need to request the USE_FULL_SCREEN_INTENT permission in order for the        
// platform to invoke this notification.        
.setFullScreenIntent(fullScreenPendingIntent, true)     
val incomingCallNotification = notificationBuilder.build()

向用戶(hù)顯示通知

向用戶(hù)顯示通知時(shí),他們可以根據(jù)當(dāng)前上下文選擇是確認(rèn)還是關(guān)閉應(yīng)用的提醒。例如,用戶(hù)可以選擇是接受還是拒絕來(lái)電。

如果您的通知正在進(jìn)行(例如來(lái)電),請(qǐng)將該通知與前臺(tái)服務(wù)相關(guān)聯(lián)。以下代碼段展示了如何顯示與前臺(tái)服務(wù)關(guān)聯(lián)的通知:

// Provide a unique integer for the "notificationId" of each notification.    
//startForeground(notificationId, notification)

注意:系統(tǒng)界面可以選擇在用戶(hù)使用設(shè)備時(shí)顯示提醒式通知,而不是啟動(dòng)全屏 intent。

通知的優(yōu)勢(shì)

這種基于通知的提醒系統(tǒng)可以為用戶(hù)提供以下幾個(gè)優(yōu)勢(shì):

  • 當(dāng)用戶(hù)使用設(shè)備時(shí),系統(tǒng)會(huì)向他們顯示提醒式通知,從而讓他們接聽(tīng)或拒絕來(lái)電或者關(guān)閉鬧鐘。用戶(hù)可以維護(hù)其當(dāng)前的上下文并控制他們?cè)谄聊簧峡吹降膬?nèi)容。
  • 您的來(lái)電或鬧鐘會(huì)受到用戶(hù)的“勿擾”規(guī)則的影響。例如,在啟用“勿擾”功能后,用戶(hù)可以?xún)H允許來(lái)自特定聯(lián)系人或重復(fù)來(lái)電者的來(lái)電。
  • 當(dāng)設(shè)備的屏幕關(guān)閉時(shí),您的全屏 intent 會(huì)立即啟動(dòng)。
  • 在設(shè)備的設(shè)置屏幕中,用戶(hù)可以查看哪些應(yīng)用最近發(fā)送了通知(包括來(lái)自特定通知渠道的通知)。在該屏幕中,用戶(hù)可以控制他們的通知偏好設(shè)置。

后記

這期純轉(zhuǎn),畢竟Google已經(jīng)講得很明白了,并沒(méi)啥好拓展出來(lái)講得,按照要求來(lái)做就行了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容