Android Q 限制后台启动Activity

描述

Android Q限制在没有用户交互的情况下加载Activity。这一变化可以最大限度的减少对用户的打扰,保持用户对屏幕上所显示内容的可控性。
运行在Android Q上的APP仅在以下一种或多种情况下可运行Activity:

  1. APP存在一个可视的窗口,例如一个处于前台的Activity
  2. 另外一个处于前台的APP发送一个属于当前APP的PendingIntent。例如Custom Tabs provider发送一个menu item pending intent。
  3. 系统发送一个PendingIntent,例如点击一个通知。
  4. 系统给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可能需要立即引起用户的注意,例如闹钟响铃或来电提醒。你可以通过以下方式来达到提醒用户的目的:

  1. 创建一个高级别的通知
    确保你创建的通知的标题和消息可以准确表达你的意图。你也可以提供一个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()
  1. 显示通知给用户
    当显示通知给用户时,用户可以根据当前的情况选择接受或者取消该通知。例如,用户可以选择接电话,也可以挂掉电话。
    如果你的通知是连续不间断的,例如来电提醒,可以给该通知关联一个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

    原文作者:Peak Yuan
    原文地址: https://blog.csdn.net/rui574081323/article/details/88894403
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞