如何解决如何在Kotlin的Fragment中使用Android AlarmManager?
我似乎无法让AlarmManager在Fragment中工作。我的接收器的onReceive()方法永远不会执行。我以为我可能以错误的方式使用上下文,但是同样,我也无法使它在Activity中工作。我还已经在清单中注册了接收者。
MyFragment.kt
class MyFragment : Fragment() {
...
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
var alarmMgr: AlarmManager? = null
lateinit var alarmIntent: PendingIntent
alarmMgr = context!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmIntent = Intent(context,Receiver::class.java).let { intent ->
PendingIntent.getService(context,intent,0)
}
val calendar: Calendar = Calendar.getInstance().apply {
timeInMillis = System.currentTimeMillis()
// The EditText includes a time in 24-hour format (e.g. 12:34)
set(Calendar.HOUR_OF_DAY,editText.text.toString().substringBefore(":").toInt())
set(Calendar.MINUTE,editText.text.toString().substringAfter(":").toInt())
}
Log.d("ALARM","CREATED")
alarmMgr?.set(
AlarmManager.RTC,calendar.timeInMillis,alarmIntent
)
}
}
Receiver.kt
class Receiver : broadcastReceiver() {
override fun onReceive(context: Context?,intent: Intent?) {
Log.d("ALARM","RECEIVED")
}
}
AndroidManifest.xml
<application
...
<receiver android:name="com.example.name.Receiver" />
</application>
解决方法
第一件事:
AndroidManifest.xml
<receiver
android:name="com.example.name.Receiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
</intent-filter>
</receiver>
然后,在这种情况下,在您的Fragment中,我建议在其他地方进行此操作:
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(context,Receiver::class.java)
// Used for filtering inside Broadcast receiver
intent.action = "MyBroadcastReceiverAction"
val pendingIntent = PendingIntent.getBroadcast(context,intent,0)
// In this particular example we are going to set it to trigger after 30 seconds.
// You can work with time later when you know this works for sure.
val msUntilTriggerHour: Long = 30000
val alarmTimeAtUTC: Long = System.currentTimeMillis() + msUntilTriggerHour
// Depending on the version of Android use different function for setting an
// Alarm.
// setAlarmClock() - used for everything lower than Android M
// setExactAndAllowWhileIdle() - used for everything on Android M and higher
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) {
alarmManager.setAlarmClock(
AlarmManager.AlarmClockInfo(alarmTimeAtUTC,pendingIntent),pendingIntent
)
} else {
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,alarmTimeAtUTC,pendingIntent
)
}
然后在您的广播接收器中,执行以下操作:
class Receiver : BroadcastReceiver() {
override fun onReceive(context: Context?,intent: Intent?) {
// We use this to make sure that we execute code,only when this exact
// Alarm triggered our Broadcast receiver
if (intent?.action == "MyBroadcastReceiverAction") {
Log.d("ALARM","RECEIVED")
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。