如何在后台从服务设置AlarmClock警报?

问题描述

我希望每次运行服务时都能从后台设置可变警报。我正在使用以下代码

...
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        ...
        Intent i = new Intent(AlarmClock.ACTION_SET_ALARM);
        i.putExtra(AlarmClock.EXTRA_SKIP_UI,true);
        i.putExtra(AlarmClock.EXTRA_HOUR,9);
        i.putExtra(AlarmClock.EXTRA_MINUTES,9);
        i.putExtra(AlarmClock.EXTRA_MESSAGE,"Good Morning");
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);
    }
...

我知道有一个活动cannot be started from the background。但是还有其他方法或技巧可以完成我在这里要做的事情吗?

解决方法

查看计划重复警报documentation,可以将AlarmManagerPendingIntent一起使用,如下所示。

启动服务时,您始终可以设置闹钟并将闹钟设置为使用当前时间立即触发。

警报响起时,它会向广播接收器发送一个意图(在以下情况下为AlarmReceiver-自行制作)。然后,您可以从AlarmReceiver进行任何操作。

可能值得在整个documentation中运行,因为我发现它超级有用。最多只需要15分钟,真的很清楚,应该可以满足您的要求。

private var alarmMgr: AlarmManager? = null
private lateinit var alarmIntent: PendingIntent
...
alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmIntent = Intent(context,AlarmReceiver::class.java).let { intent ->
    PendingIntent.getBroadcast(context,intent,0)
}

// Set the alarm to start at 8:30 a.m.
val calendar: Calendar = Calendar.getInstance().apply {
    timeInMillis = System.currentTimeMillis()
    set(Calendar.HOUR_OF_DAY,8)
    set(Calendar.MINUTE,30)
}

// setRepeating() lets you specify a precise custom interval--in this case,// 20 minutes.
alarmMgr?.setRepeating(
        AlarmManager.RTC_WAKEUP,calendar.timeInMillis,1000 * 60 * 20,alarmIntent
)