android - 在 MainActivity 中创建和访问 BroadcastReceiver 的正确方法?(科特林)
问题描述
在 Activity 中为警报管理器创建和使用 BroadcastReceiver 的正确方法是什么?
我确实看过以下答案,但我不清楚是否需要注册广播接收器以及如何使用 AlarmManager 进行注册(如果是)。此外,我不清楚我是否应该在 OnCreate() 函数内创建 BroadcastReceiver 或作为类变量。
Kotlin AlarmManager 和 BroadcastReceiver 不工作
背景:
我正在尝试制作一个应用程序:
在特定时间播放歌曲
更新下次播放歌曲的时间
我能够像通常那样通过为 BroadcastReceiver 文件创建一个单独的文件来获得 1) 的工作,但是我无法访问 AlarmManager,因为它仅在 AppCompatActivity 类中可用。我还尝试使用意图移回主要活动并在那里设置新警报,但这也确实有效,因为 BroadcastReceiver 没有上下文。
我现在试图在 MainActivity 中使用 BroadcastReceiver 但它没有被触发:
private lateinit var picker: MaterialTimePicker
private lateinit var alarmManager: AlarmManager
private lateinit var calendar: Calendar
val broadCastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
var mp = MediaPlayer.create(context, R.raw.song_title)
mp.setVolume(1.0f, 1.0f)
mp.start()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var calendar = Calendar.getInstance()
val intent = Intent(this, MainActivity::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0)
alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
val newDate = Calendar.getInstance()
newDate.add(Calendar.MINUTE, 1)
calendar[java.util.Calendar.HOUR_OF_DAY] = newDate.get(Calendar.HOUR_OF_DAY)
calendar[java.util.Calendar.MINUTE] = newDate.get(Calendar.MINUTE)
calendar[java.util.Calendar.SECOND] = 0
calendar[java.util.Calendar.MILLISECOND] = 0
alarmManager.setAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
}
}
解决方案
AlarmManager 不仅在 AppCompatActivity 类中可用,而且在您可以访问Context的任何地方都可用,如下所示:
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val alarmManager = context?.getSystemService(ALARM_SERVICE) as AlarmManager
}
}
推荐阅读
- python-3.x - 尽管 Selenium WebDriver 只有部分页面被解析
- macos - 如何从命令行在 macOS Catalina 上设置“点击以单击”行为?
- jpa - @Query - 返回原始类型或字符串对象?
- c++ - 用函数包装以返回不同的类型
- laravel - Laravel 列求和
- python - ImportError:libQt5QmlModels.so.5:无法打开共享对象文件:没有这样的文件或目录?
- python - 显示编号列表
- flutter - 如何将 native_pdf_view 集成到我的应用程序中(颤振)?
- scala - 将苹果放在用 Scala 编写的蛇游戏中
- c++ - 从垂直法线找到每个轴的角度