android - 当应用程序处于后台时,如何从 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)
解决方案
正如您评论的那样,当您的应用在Android 10 (API level 29)上处于后台时,您正尝试启动一个活动。
从 Android(API 级别 29)开始,当您的应用程序处于后台时,他们对打开 Activity 设置了一些限制。
Android 10(API 级别 29)及更高版本对应用在后台运行时何时启动 Activity 施加了限制。
您可以在此处找到从后台启动活动的限制。
他们还提到
在几乎所有情况下,后台应用程序都应该显示时间敏感的通知,以向用户提供紧急信息,而不是直接启动活动。何时使用此类通知的示例包括处理来电或活动闹钟。
因此,要克服这种行为,而不是在后台调用您的应用程序,您应该显示具有全屏意图的高优先级通知。
有关高优先级通知和全屏 Intent 的更多信息,您可以在此处查看显示时间敏感通知
推荐阅读
- php - 无论 codeigniter 的配置设置中提到的时间如何,用户会话都会意外过期
- node.js - 将包添加为对等依赖项时出现 NPM 错误
- knative - Knative 的 Kafka Broker 是否可以接收来自其集群外部的事件?
- vbscript - VBScript - 800A0401 - 预期的语句结束
- algorithm - 如何计算矩阵乘法的成本或运算次数?
- amazon-ecs - 关于将 mongodb 部署为 AWS Fargate 中的容器
- java - Mockito 测试用例的 Finagle Future onFailure 代码覆盖率问题
- vb.net - 如何使用 keyup 事件筛选矩形?
- python - discord.py 子命令给出错误命令未找到
- oracle - Symfony 实体 - Oracle 默认 SYSDATE 不起作用