首页 > 解决方案 > 当应用程序处于后台时,如何从 BroadcastReceiver 的 onReceive() 方法启动活动?

问题描述

我想从onReceive()BroadcastReceiver 的方法开始一个活动。这是我正在使用的代码:

class TimeReminderReceiver : BroadcastReceiver() {
     override fun onReceive(p0: Context?, p1: Intent?) {
         println("RECEIVED")

         val i = Intent(p0!!, TimeReminderActivity::class.java)
         i.flags = Intent.FLAG_ACTIVITY_NEW_TASK
         p0.startActivity(i)
     }
}

这个问题在stackoverflow中有很多答案,我都试过了,但没有一个对我有用。该应用程序只是打印 RECEIVED并停留在那里。logcat 上什么都没有显示,没有例外,什么都没有。我也在 mainfest 中添加了接收器。

<receiver
        android:name=".receivers_and_activities.TimeReminderReceiver" />

这段代码有什么问题?

编辑:

调用广播的代码:

val intent = Intent(this@MainActivity, TimeReminderReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this@MainActivity, 0, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT)
val am = this@MainActivity.getSystemService(Context.ALARM_SERVICE) as AlarmManager
am.set(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)

标签: androidkotlinbroadcastreceiver

解决方案


正如您评论的那样,当您的应用在Android 10 (API level 29)上处于后台时,您正尝试启动一个活动。

从 Android(API 级别 29)开始,当您的应用程序处于后台时,他们对打开 Activity 设置了一些限制。

Android 10(API 级别 29)及更高版本对应用在后台运行时何时启动 Activity 施加了限制。

您可以在此处找到从后台启动活动的限制

他们还提到

在几乎所有情况下,后台应用程序都应该显示时间敏感的通知,以向用户提供紧急信息,而不是直接启动活动。何时使用此类通知的示例包括处理来电或活动闹钟。

因此,要克服这种行为,而不是在后台调用您的应用程序,您应该显示具有全屏意图的高优先级通知

有关高优先级通知和全屏 Intent 的更多信息,您可以在此处查看显示时间敏感通知


推荐阅读