在 Android Q 中从接收器开始 activity
Start activity from receiver in Android Q
我正在使用 Android Q [beta 6] 检查我的应用程序,以便添加所有必需的更改以与上一个 SO 完全兼容。但是,我发现我正在使用接收器从后台启动 Activity,并且由于最后实施的后台限制 (https://developer.android.com/preview/privacy/background-activity-starts),activity 未打开。
我尝试同时使用接收方上下文和应用程序上下文来启动 activity,但在这两种情况下,系统都会提示无法从后台启动 activity。
我在 Receiver 上试过的...
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context?.applicationContext?.let {
it.startActivity(Intent(it, MyActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
})
PushUtils.showReceiverCalledNotification(it)
}
}
这样我想启动 MyActivity 并在调用接收器时显示通知。相反,我可以看到通知,但 Activity 从未启动。立即启动activity的功能非常重要,所以有一种方法可以从接收器继续启动activity吗?
It is very important for the feature to start the activity immediately, so there is a way to continue starting the activity from the receiver?
不,对不起。使用高优先级通知,因此它以 "heads-up" 模式出现。然后用户可以快速点击它以调出您的 activity.
由于限制,您无法从后台启动activity。相反,您可以按照 CommonsWare 的建议和 android 开发者网站上的建议使用通知。
这是官方文档,其中列出了何时可以使用以及何时不能使用的情况。
https://developer.android.com/guide/components/activities/background-starts
你可以这样使用:
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context ?: return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
showNotification(context.applicationContext)
} else {
context.applicationContext.startActivity(Intent(context, MyActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
})
}
PushUtils.showReceiverCalledNotification(context)
}
private fun showNotification(context: Context) {
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager ?: return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel("default", "default", NotificationManager.IMPORTANCE_DEFAULT)
manager.createNotificationChannel(channel)
}
val intent = Intent(context, MyActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT)
with(NotificationCompat.Builder(context, "default")) {
setSmallIcon(R.drawable.ic_scan_colored)
setContentTitle("Custom Title")
setContentText("Tap to start the application")
setContentIntent(pendingIntent)
setAutoCancel(true)
manager.notify(87, build())
}
}
}
我正在使用 Android Q [beta 6] 检查我的应用程序,以便添加所有必需的更改以与上一个 SO 完全兼容。但是,我发现我正在使用接收器从后台启动 Activity,并且由于最后实施的后台限制 (https://developer.android.com/preview/privacy/background-activity-starts),activity 未打开。
我尝试同时使用接收方上下文和应用程序上下文来启动 activity,但在这两种情况下,系统都会提示无法从后台启动 activity。
我在 Receiver 上试过的...
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context?.applicationContext?.let {
it.startActivity(Intent(it, MyActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
})
PushUtils.showReceiverCalledNotification(it)
}
}
这样我想启动 MyActivity 并在调用接收器时显示通知。相反,我可以看到通知,但 Activity 从未启动。立即启动activity的功能非常重要,所以有一种方法可以从接收器继续启动activity吗?
It is very important for the feature to start the activity immediately, so there is a way to continue starting the activity from the receiver?
不,对不起。使用高优先级通知,因此它以 "heads-up" 模式出现。然后用户可以快速点击它以调出您的 activity.
由于限制,您无法从后台启动activity。相反,您可以按照 CommonsWare 的建议和 android 开发者网站上的建议使用通知。
这是官方文档,其中列出了何时可以使用以及何时不能使用的情况。
https://developer.android.com/guide/components/activities/background-starts
你可以这样使用:
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context ?: return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
showNotification(context.applicationContext)
} else {
context.applicationContext.startActivity(Intent(context, MyActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
})
}
PushUtils.showReceiverCalledNotification(context)
}
private fun showNotification(context: Context) {
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager ?: return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel("default", "default", NotificationManager.IMPORTANCE_DEFAULT)
manager.createNotificationChannel(channel)
}
val intent = Intent(context, MyActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT)
with(NotificationCompat.Builder(context, "default")) {
setSmallIcon(R.drawable.ic_scan_colored)
setContentTitle("Custom Title")
setContentText("Tap to start the application")
setContentIntent(pendingIntent)
setAutoCancel(true)
manager.notify(87, build())
}
}
}