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

eeg*_*per 2 android broadcastreceiver kotlin

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)
     }
}
Run Code Online (Sandbox Code Playgroud)

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

<receiver
        android:name=".receivers_and_activities.TimeReminderReceiver" />
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题?

编辑:

调用广播的代码:

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)
Run Code Online (Sandbox Code Playgroud)

Muh*_*han 9

正如您所评论的那样,当您的应用程序在Android 10(API 级别 29)上处于后台时,您正在尝试启动活动。

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

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

您可以在这里找到从后台启动活动的限制

他们还提到

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

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

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