【问题标题】:Android set alarm manager when another is finishedAndroid在另一个完成时设置警报管理器
【发布时间】:2023-03-13 15:58:01
【问题描述】:

我尝试使用AlarmManagersetRepeating,然后我读到该方法在API 26+ 中不再有效,因此另一种解决方案是在前一个警报完成时安排每个警报。我该怎么做?

MainActivity.java

 public class MainActivity extends AppCompatActivity {
calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());

calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour.getText().toString()));
calendar.set(Calendar.MINUTE, Integer.parseInt(minute.getText().toString()));
calendar.set(Calendar.SECOND, 00);


Intent intent = new Intent(getApplicationContext(), Notification_receiver.class);

pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}

Notification_reciever.java

public class Notification_receiver extends BroadcastReceiver {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);

        Intent repeating_intent = new Intent(context, MainActivity.class);

        repeating_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, time, repeating_intent, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
                .setContentIntent(pendingIntent)
                .setChannelId(CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_baseline_notifications_active_24)
                .setContentTitle("Notification Title")
                .setContentText("Notification Text")
                .setAutoCancel(true);


        notificationManager.notify(time, builder.build());
}

上一个警报管理器完成后如何创建另一个警报管理器?

【问题讨论】:

    标签: android alarmmanager repeatingalarm


    【解决方案1】:

    您需要在BroadcastReceiver结尾处安排下一个闹钟

    public class AlarmBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            ...
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nextAlarmTimeInMillis(), pendingIntent);
    

    请注意,由于不同 OEM 实施的电池节省机制不同,AlarmManager 不能保证始终工作。请参考https://issuetracker.google.com/issues/122098785

    简而言之,AlarmManager 是当前最好的可用机制,即使没有 Internet 连接,定时通知也能正常工作。但是,不能保证一直工作。

    【讨论】:

      【解决方案2】:

      这里是每 2 分钟发出一次警报的示例(在 API 30 上测试)

      移动代码以在自己的类中从MainActivity 设置警报

      public class AlarmExecutor {
      
          public static void makeAlarm(Context context, int minute) {
              Calendar calendar = Calendar.getInstance();
              calendar.setTimeInMillis(System.currentTimeMillis());
              calendar.add(Calendar.MINUTE, minute);
      
              Intent intent = new Intent(context, Notification_receiver.class);
      
              PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
      
              AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
              alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
      
              Log.d("Testing", "make alarm at " + calendar.getTime().toString());
          }
      }
      

      现在可以添加了

      • Notification_receiver.javanotificationManager.notify(time, builder.build()); 之后
      • 主要活动

      下一行

      // make alarm in 2 minutes
      AlarmExecutor.makeAlarm(context, 2);
      

      每 2 分钟发出一次警报。

      别忘了在Manifest注册接收者

      <application >
          <receiver android:name=".yourReceiver" />
      
      </application>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多