描述
Android Q限制在没有用户交互的情况下加载Activity。这一变化可以最大限度的减少对用户的打扰,保持用户对屏幕上所显示内容的可控性。
运行在Android Q上的APP仅在以下一种或多种情况下可运行Activity:
- APP存在一个可视的窗口,例如一个处于前台的Activity
- 另外一个处于前台的APP发送一个属于当前APP的PendingIntent。例如Custom Tabs provider发送一个menu item pending intent。
- 系统发送一个PendingIntent,例如点击一个通知。
- 系统给APP发送一个广播,如SECRET_CODE_ACTION。
注:APP启动一个前台运行的Service并不代表该APP处于前台运行状态。
这一行为变化影响所有运行在Android Q上的app,包括target是Android 9或更低的APP。如果你的APP target是Android 9及以下,并且之前运行在Android 9或更低版本的设备上,那么在该设备升级到Android Q以后,该APP也会受到影响。
警告信息
在Android Q Beta 1版本中,如果你的APP试图从后台启动一个Activity,平台允许加载Activity,但是会在控制台输出警告信息,并且会给用于Toast提示:
This background activity start from package-name will be blocked in future Q builds.
创建通知
谷歌建议使用通知的方式解决这一问题
绝大多数情况下,运行在后台的APP应该创建一个通知,给用户提供一些必要的信息,而不应该直接从后台启动Activity。
某些特殊情况下,你的APP可能需要立即引起用户的注意,例如闹钟响铃或来电提醒。你可以通过以下方式来达到提醒用户的目的:
- 创建一个高级别的通知
确保你创建的通知的标题和消息可以准确表达你的意图。你也可以提供一个FullScreenIntent,示例代码如下:
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()
- 显示通知给用户
当显示通知给用户时,用户可以根据当前的情况选择接受或者取消该通知。例如,用户可以选择接电话,也可以挂掉电话。
如果你的通知是连续不间断的,例如来电提醒,可以给该通知关联一个foreground service:
// Provide a unique integer for the "notificationId" of each notification.
startForeground(notificationId, notification)
当用户正在使用设备时,系统UI会显示一个heads-up notification取代你的full-screen intent
使用通知的优点
- 当用户正在使用设备时,系统显示一个heads-up notification,用户可以选择根据当前情况有选择性的处理这个通知。
- 遵守了不打扰用户的规则(Do Not Disturb)
- 当设备屏幕关闭时,full-screen intent可以立即显示出来
- 在Settings界面,用户可以看到最近有哪些App发送过通知,包括从特殊通知渠道发送的。在这个界面,用户可以控制通知是否显示。
在Android Q Beta1版本中,上述行为变化还没有生效。你可以通过开发者选择来模拟这一变化:
- Settings -> Developer options,取消选择 Allow background activity starts
- 或者使用命令行:
adb shell settings put global background_activity_starts_enabled 0
参考链接:https://developer.android.google.cn/preview/privacy/background-activity-starts