AlarmManager重复

sta*_*dan 4 time notifications android alarmmanager

我有一个警报,在特定时间发送通知(如果在那一天有联系人的生日).

我需要的是,当我设置闹钟时,它应该在同一天和同一时间每年重复一次.我怎么能这样做?

Intent myIntent = new Intent(Main.this, MyAlarmService.class);
pendingIntent = PendingIntent.getService(Main.this, 0, myIntent, 0);

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.clear();
cal.set(2012,5,20,18,40);

alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 60*60*24*365*1000, pendingIntent);
Run Code Online (Sandbox Code Playgroud)

这是AlarmService:

public class MyAlarmService extends Service {
  static final int uniqueID = 1394885;
  private PendingIntent pendingIntent;

  @Override
  public void onCreate() {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG).show();

  }

  @Override
  public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show();
    return null;
  }

  @Override
  public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show();
  }

  @Override
  public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub

  }

  @Override
  public boolean onUnbind(Intent intent) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG).show();
    return super.onUnbind(intent);
  }
}
Run Code Online (Sandbox Code Playgroud)

请问你能帮帮我吗?

vuh*_*990 7

Intent intent = new Intent(this, MyReceiver.class);
intent.putExtra("key", "Alert");
pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0);

alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar=Calendar.getInstance();

// Calendar.set(int year, int month, int day, int hourOfDay, int minute, int second)
calendar.set(2013, Calendar.OCTOBER, 13, 18, 55, 40);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5*1000, pendingIntent);
Run Code Online (Sandbox Code Playgroud)

此参数是后续警报重复之间的间隔(以毫秒为单位):

5*1000 = 5秒

样品:

1年= 365(天)*24(小时)*60(分钟)*60(秒)*1000(秒 - >毫秒);
//闰年366天

月份值基于0,因此使用常量可能更清楚 Calendar.OCTOBER

MyReceiver.java

public class MyReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
       Toast.makeText(context,intent.getStringExtra("key"),Toast.LENGTH_SHORT).show();
  }

}
Run Code Online (Sandbox Code Playgroud)

更新:注意:从API 19(Build.VERSION_CODES.KITKAT)开始,警报传递不准确:操作系统将移动警报以最小化唤醒和电池使用.有新的API支持需要严格交付保证的应用程序; 请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent).targetSdkVersion早于API 19的应用程序将继续查看之前的行为,其中所有警报都在请求时准确传递.参考

我建议使用JobScheduler for android 21或Firebase JobDispatcher用于旧设备而不是Alarm Manager

更新:Google已将WorkManager作为使用WorkManager的JetPack 计划任务的一部分发布