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)
请问你能帮帮我吗?
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 计划任务的一部分发布