安卓如何设置多个闹钟

47

我正在尝试实现一个需要在时间轴上多次触发提醒(或警报)的Android应用程序。

我已经搜索过了,但最接近的结果是设置固定数量的闹钟,而且我猜想这个例子并没有起作用。

我想知道是否存在一种方法可以动态地设置多个闹钟,例如一个闹钟数组,然后在它们各自的特定时间戳上触发这些闹钟。


4个回答

103
如果您想要设置多个闹钟(重复或单次),则只需要使用不同的requestCode创建它们的PendingIntent。 如果requestCode相同,则新的闹钟将覆盖旧的闹钟。
下面是创建多个单次闹钟并将它们保存在ArrayList中的代码。我将PendingIntent保存在数组中,因为这是取消闹钟所需的内容。
// context variable contains your `Context`
AlarmManager mgrAlarm = (AlarmManager) context.getSystemService(ALARM_SERVICE);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();

for(i = 0; i < 10; ++i)
{
   Intent intent = new Intent(context, OnAlarmReceiver.class);
   // Loop counter `i` is used as a `requestCode`
   PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0);
   // Single alarms in 1, 2, ..., 10 minutes (in `i` minutes)
   mgrAlarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                SystemClock.elapsedRealtime() + 60000 * i, 
                pendingIntent); 

   intentArray.add(pendingIntent);
}

另外,查看这个问题:如何在Android中同时设置多个闹钟?


我使用了上面的代码,问题是我的接收器类被调用了很多次。在接收器类中,我通过启动一个服务来获取当前位置并发送到服务器,因此由于这个原因,相同的位置会被多次插入到数据库中。 - gautam
@Nikolai Samteladze 把所有的警报放在一个ArrayList中是否更容易,因为删除ArrayList比逐个删除所有警报更容易?此外,将警报加载到Cursor对象中(例如在设备BOOT_COMPLETED后使用)是否比上面使用的“for”循环更有效或更高效? - AJW

6
你可以设置闹钟的重复时间:
在这种情况下:
public void AddAlarm(int requestCode,MutableDateTime dueDate,int repeat) {
        Intent intent = new Intent(context, AlarmReceiver.class);
        intent.putExtra(Constants.RECORD_ID, requestCode);
        intent.putExtra("REPEAT", repeat);
        PendingIntent operation = PendingIntent.getBroadcast(context, requestCode, intent,  PendingIntent.FLAG_ONE_SHOT );
        MutableDateTime due = dueDate.toMutableDateTime();
        switch(repeat){
        case NO_REPEAT:
            due.addMinutes(0);
            break;
        case DAILY:

            due.addDays(1); 
            break;
        case WEEKLY:
            due.addWeeks(1);
            break;
        case MONTHLY:
            due.addMonths(1);
            break;
        case MONTHLY_2:
            due.addWeeks(5);            
            break;
        case YEARLY:
            due.addYears(1);
            break;
        }
        due.add(-(dueDate.getMillis()));
        due.setSecondOfMinute(0);
        dueDate.setSecondOfMinute(0);
        alarm.cancel(operation);
        alarm.set(AlarmManager.RTC_WAKEUP, dueDate.getMillis(), operation);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, dueDate.getMillis(), due.getMillis(), operation);
}

请注意,我使用了joda datetime库来更轻松地操作日期,以防您不知道。 - iamkristher
我注意到了:)。感谢你的提示和回答。请查看我选择的切换答案,以了解我正在寻找什么。但我也感谢你;) - Sammy
@iamkristher 顺便问一下,MONTHLY_2 是什么? - Fer

2
为了动态设置多个闹钟,我采用的方法是创建一个单一的闹钟。然后在我的闹钟设置类中,初始化了一个静态整数(用作请求代码),每当我在主活动中点击“添加闹钟”按钮时,该整数就会递增。 例如:

MainActivity.java

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void addAlarmClick(View v) {
    AlarmActivity.broadcastCode++;
    startActivity(new Intent(this, AlarmActivity.class));
}
}

AlarmActivity.java

public class AlarmActivity extends AppCompatActivity {`

public static int broadcastCode=0;
/*some code here*/
Intent myIntent = new Intent(AlarmActivity.this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(AlarmActivity.this,
                            broadcastCode, myIntent, 0);

希望这能帮到你。


0

你可以在 pendingIntent 中设置一个连接时间的 requestCode:

pendingIntent = PendingIntent.getBroadcast(
    this, (calendar.timeInMillis).toInt(), intent, 0
)

注意:您的requestCode也可以是绝对随机的整数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接