5

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

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

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);

这是警报服务:

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);
  }
}

请问你能帮帮我吗?

4

2 回答 2

8
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);

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

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();
  }

}

更新:注意:从 API 19 (Build.VERSION_CODES.KITKAT) 开始,警报传递不准确:操作系统将切换警报以最大程度地减少唤醒和电池使用。有新的 API 来支持需要严格交付保证的应用程序;参见 setWindow(int, long, long, PendingIntent) 和 setExact(int, long, PendingIntent)。targetSdkVersion 早于 API 19 的应用程序将继续看到以前的行为,即所有警报都在请求时准确传递。参考

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

更新:Google 已将 WorkManager 作为 JetPack Schedule 任务的一部分与 WorkManager 一起发布

于 2013-10-31T04:27:15.913 回答
4

使用设置闹钟alarmManager.set()

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);  

并且,当闹钟响起时,从MyAlarmService.

于 2012-06-20T16:11:09.553 回答