我的課上有這段代碼:
public void setAlarm(Context context)
{
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, StepCountUpdaterAlarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
Long startOfTommorowMillis = calendar.getTimeInMillis();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Long startOfTodayMillis = calendar.getTimeInMillis();
calendar.set(Calendar.HOUR_OF_DAY, 6);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
Long startOfAlarmMillis = calendar.getTimeInMillis() - startOfTodayMillis;
Long totalWaitMillis = (startOfTodayMillis startOfAlarmMillis) - System.currentTimeMillis();
if(totalWaitMillis < 0) return;
if (android.os.Build.VERSION.SDK_INT >= 23) {
alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
totalWaitMillis,
pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP,
totalWaitMillis,
pendingIntent);
}
}
我想做的是每天早上 6:30 UTC 發出警報。為此,我使用 Long totalWaitMillis = (startOfTomorrowMillis startOfAlarmMillis) - System.currentTimeMillis();但出于測驗目的,我將其更改為使用startOfTodayMillis,以便我可以測驗警報。我設法讓日歷顯示正確的觸發時間startOfTodayMillis - startOfAlarmMillis。當我減去System.currentTimeMillis()時,它似乎為接下來觸發警報提供了正確的毫秒延遲量。實際上,它以毫秒為單位計算時間,直到今天達到 6:30(在這種情況下,我過去沒有觸發它)。然而,盡管如此,它還是很早就開火了,而且比預期的要早得多。當我也使用時startOfTomorrowMillis startOfAlarmMillis,它幾乎提前一天觸發多次。在使用 AlarmManager 時,我是新手,因此我們將不勝感激。
編輯:我知道這些鬧鐘計時器并不準確。我預計會有幾秒鐘的偏移,但不是幾分鐘或足夠接近一天。為了添加一些細節,我剛嘗試在一個小時后設定鬧鐘,在設定鬧鐘后的最初 30 秒后,它在大約 20 秒內至少觸發了 5 次。我的設備當前使用該setAndAllowWhileIdle方法。
uj5u.com熱心網友回復:
對于經常性的警報,您為什么要這樣做......警報管理器已經有自己的方法來每 24 小時進行一次警報。
首先創建一個帶有廣播接收器的類
class AlarmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent?) {
Log.d("this", "notify")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val intent = Intent(context, AlarmActivity2::class.java)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
val builder = NotificationCompat.Builder(context, "111")
.setSmallIcon(R.drawable.blue_stringart)
.setContentTitle("Alarm is running")
.setAutoCancel(true)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setDefaults(NotificationCompat.DEFAULT_SOUND)
.setDefaults(NotificationCompat.DEFAULT_VIBRATE)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.addAction(R.drawable.ic_baseline_stop_24,"Stop",pendingIntent)
.setContentIntent(pendingIntent)
val notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)
val r = RingtoneManager.getRingtone(context, notification)
r.play()
val notificationManagerCompat = NotificationManagerCompat.from(context)
notificationManagerCompat.notify(123, builder.build())
}
}
}
之后轉到您的活動類 make 2 方法并呼叫 oncreate
private fun setAlarm1() {
var calender: Calendar
calender = Calendar.getInstance()
calender.set(Calendar.HOUR_OF_DAY, PUT_YOUR_ALARM HOUR)
calender.set(Calendar.MINUTE, PUT_YOUR_ALARM MINUTE)
calender.set(Calendar.SECOND, 0)
alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val thuReq: Long = Calendar.getInstance().timeInMillis 1
var reqReqCode = thuReq.toInt()
if (calender.timeInMillis < System.currentTimeMillis()) {
calender.add(Calendar.DAY_OF_YEAR, 1)
}
val alarmTimeMilsec = calender.timeInMillis
val intent = Intent(this, AlarmReceiver::class.java)
intent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
val pendingIntent = PendingIntent.getBroadcast(this, reqReqCode, intent, 0)
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
calender.timeInMillis,
24 * 60 * 60 * 1000,// or AlarmManager.INTERVAL_DAY
pendingIntent
)
private fun createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = "Alarmclock Channel"
val description = " Reminder Alarm manager"
val importance = NotificationManager.IMPORTANCE_HIGH
val notificationChannel = NotificationChannel(CHANNELID, name, importance)
notificationChannel.description = description
val notificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(notificationChannel)
}
}
注意 -必須做(轉到您的應用設定并授予通知權限) 1.alarmManager.setRepeating 在這里您可以根據需要使用您的警報型別。2.requestcode對于每個報警必須是唯一的。3.您必須設定鬧鐘時間并保存在calender.timeInMillis中,這是您期望的鬧鐘時間。
下面還有問題評論
uj5u.com熱心網友回復:
問題中顯示的方法是讓警報在空閑狀態下作業,但重復自身,這不是我在閱讀其檔案時在 AlarmManager 中看到的可用功能。
我最初對 AlarmManager 的誤解是setAndAllowWhileIdleandset方法的第二個引數Long triggerAtMillis不是倒計時到下一次應該觸發警報的時間,而是應該為下一次警報觸發的實際時間。此處和下方triggerAtMillis顯示的引數的檔案:
triggerAtMillis:警報應該響起的時間(以毫秒為單位),使用適當的時鐘(取決于警報型別)。
由@Niaj Mahmud 提供,我對他提供的答案做出了自己的改變,它可以在手機處于打盹模式/空閑時執行預定任務。在此示例中,我將任務安排在每天晚上 11:58,無需通知。
Activity.java 代碼:
public void setAlarm(Context context)
{
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, StepCountUpdaterAlarm.class);
intent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 58);
calendar.set(Calendar.SECOND, 0);
if (calendar.getTimeInMillis() < System.currentTimeMillis()) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
BroadcastReciever.java 代碼
@Override
public void onReceive(Context context, Intent intent) {
MyActivity myActivity = MyActivity.getInstance();
//Do your work here.
myActivity.setAlarm(context); //Set your alarm again to reschedule itself.
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/428329.html
