如何在 android 中设置多个警报以在我的应用程序生命周期之外执行基于时间的操作?
how to set multiple Alarm in android to perform time-based operations outside the lifetime of my application?
在我的应用程序的主要 activity 中,有两个文本字段供用户插入日期和时间,还有一个按钮开始。单击开始按钮时,它会调用 broadcastReceiver class 的 setProgrammedTimer 方法,该方法在用户输入的日期和时间设置警报,在这些日期和时间,应用程序调用 activity DIAL phone。但是,如果我插入一个日期和一次并单击开始按钮,然后在我插入一个新的日期和时间并单击开始按钮后,应用程序 运行 只有第二个闹钟。我该如何执行这两个警报?
这是主要的按钮启动代码 activity:
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
year = Integer.valueOf(yearT.getText().toString());
month = Integer.valueOf(monthT.getText().toString());
day = Integer.valueOf(dayT.getText().toString());
hour = Integer.valueOf(hourT.getText().toString());
minute = Integer.valueOf(minuteT.getText().toString());
timer.setProgrammedTimer(context,year,month,day,hour,minute);
这是 broadcastReceiver 代码:
public class TimerBroadcast extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wl.acquire();
Intent callIntent = new Intent(Intent.ACTION_DIAL);
callIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(callIntent);
wl.release();
}
public void setProgrammedTimer(Context context,int year, int month,int day, int hour, int minute){
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context,TimerBroadcast.class);
PendingIntent pi = PendingIntent.getBroadcast(context,0,intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.YEAR,anno);
cal.set(Calendar.MONTH,mese-1);
cal.set(Calendar.DAY_OF_MONTH,giorno);
cal.set(Calendar.HOUR_OF_DAY,ora);
cal.set(Calendar.MINUTE,minuti);
cal.set(Calendar.SECOND,0);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
}
当您添加第二个警报时,您正在取消第一个警报。
PendingIntent pi = PendingIntent.getBroadcast(context,0,intent, PendingIntent.FLAG_CANCEL_CURRENT);
备注FLAG_CANCEL_CURRENT。
在我的应用程序的主要 activity 中,有两个文本字段供用户插入日期和时间,还有一个按钮开始。单击开始按钮时,它会调用 broadcastReceiver class 的 setProgrammedTimer 方法,该方法在用户输入的日期和时间设置警报,在这些日期和时间,应用程序调用 activity DIAL phone。但是,如果我插入一个日期和一次并单击开始按钮,然后在我插入一个新的日期和时间并单击开始按钮后,应用程序 运行 只有第二个闹钟。我该如何执行这两个警报?
这是主要的按钮启动代码 activity:
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
year = Integer.valueOf(yearT.getText().toString());
month = Integer.valueOf(monthT.getText().toString());
day = Integer.valueOf(dayT.getText().toString());
hour = Integer.valueOf(hourT.getText().toString());
minute = Integer.valueOf(minuteT.getText().toString());
timer.setProgrammedTimer(context,year,month,day,hour,minute);
这是 broadcastReceiver 代码:
public class TimerBroadcast extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wl.acquire();
Intent callIntent = new Intent(Intent.ACTION_DIAL);
callIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(callIntent);
wl.release();
}
public void setProgrammedTimer(Context context,int year, int month,int day, int hour, int minute){
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context,TimerBroadcast.class);
PendingIntent pi = PendingIntent.getBroadcast(context,0,intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.YEAR,anno);
cal.set(Calendar.MONTH,mese-1);
cal.set(Calendar.DAY_OF_MONTH,giorno);
cal.set(Calendar.HOUR_OF_DAY,ora);
cal.set(Calendar.MINUTE,minuti);
cal.set(Calendar.SECOND,0);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
}
当您添加第二个警报时,您正在取消第一个警报。
PendingIntent pi = PendingIntent.getBroadcast(context,0,intent, PendingIntent.FLAG_CANCEL_CURRENT);
备注FLAG_CANCEL_CURRENT。