赞
踩
Android Q限制在没有用户交互的情况下加载Activity。这一变化可以最大限度的减少对用户的打扰,保持用户对屏幕上所显示内容的可控性。
运行在Android Q上的APP仅在以下一种或多种情况下可运行Activity:
注: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可能需要立即引起用户的注意,例如闹钟响铃或来电提醒。你可以通过以下方式来达到提醒用户的目的:
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()
// Provide a unique integer for the "notificationId" of each notification.
startForeground(notificationId, notification)
当用户正在使用设备时,系统UI会显示一个heads-up notification取代你的full-screen intent
在Android Q Beta1版本中,上述行为变化还没有生效。你可以通过开发者选择来模拟这一变化:
adb shell settings put global background_activity_starts_enabled 0
参考链接:https://developer.android.google.cn/preview/privacy/background-activity-starts
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。