等待具有不同意图但相同ID的意图

时间:2016-08-04 04:20:00

标签: android alarmmanager android-pendingintent

我有两个待处理的Intent用于Alarm Manager,其中一个是:

Intent i = new Intent(context, TriggerAlarm.class);  
PendingIntent pi =PendingIntent.getBroadcast(context,0,i,PendingIntent.FLAG_CANCEL_CURRENT);

另一个是:

 Intent i = new Intent(context, TriggerNotification.class);
 PendingIntent pi = PendingIntent.getBroadcast(context,0, i,PendingIntent.FLAG_CANCEL_CURRENT);

我在我的应用程序中使用这两种方法

我的问题是:

这些pendingIntents是否彼此不同?因为意图不同但Ids相同

如果我为每个待处理的意图设置了警报管理器,它们都会触发,还是一个替换另一个?

3 个答案:

答案 0 :(得分:2)

意图只是PendingIntent触发后必须执行的操作。但是这个触发标准完全取决于PendingIntent本身,而RequestCode在这里扮演了一个非常好的角色来唯一地识别,管理和触发PendingIntent。

因此,无论Intent是什么,如果requestCode重复,那么后者PendingIntent将触发。如果需要触发多个PendingIntents,则requestCode必须彼此不同。

答案 1 :(得分:2)

所以简单的方法是直接自己测试。 我在我的电脑上测试了它,这就是我得到的:

这些pendingIntents是否彼此不同?因为意图不同但Ids相同

- 虽然ID相同,但它们彼此不同

如果我为每个待处理的意图设置了警报管理器,它们都会触发,还是一个替换另一个?

- 将触发其中任何一项

以下是我的测试代码,您可以自行复制并尝试

将此方法复制到您的活动中,然后将其命名为

private void setAlarmManager() {
    Log.v("AlarmManager", "Configuring AlarmManager...");
    Intent startIntent1 = new Intent(context, AlarmReceiverFirst.class);
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, startIntent1, PendingIntent.FLAG_CANCEL_CURRENT);

    Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
    PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, PendingIntent.FLAG_CANCEL_CURRENT);

    AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 20);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Log.v("AlarmManager", "Starting AlarmManager for >= KITKAT version");
        alarm.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent1);
        alarm.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent2);
    } else {
        Log.v("AlarmManager", "Starting AlarmManager for < KITKAT version");
        alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent1);
        alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent2);
    }

    Log.v("AlarmManager", "AlarmManager has been started");
}

创建您的第一个接收器类

public class AlarmReceiverFirst extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v(this.getClass().getSimpleName(), "first alarm receiver is called");
    }
}

创建第二个接收器类

public class AlarmReceiverSecond extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v(this.getClass().getSimpleName(), "second alarm receiver is called");
    }
}

将这些接收器注册到您的清单

<receiver android:name=".AlarmReceiverFirst" />
<receiver android:name=".AlarmReceiverSecond" />

不要混淆,你在这里称为Id的称为请求代码。它用于取消待处理的意图。

答案 2 :(得分:0)

您可以使用相同的意图名称,但使用不同的ID,如下所示

Intent i = new Intent(context, TriggerAlarm.class);  
PendingIntent pi =PendingIntent.getBroadcast(context,System.currentTimeMillis(),i,PendingIntent.FLAG_CANCEL_CURRENT);

并且

Intent i = new Intent(context, TriggerNotification.class);
PendingIntent pi = PendingIntent.getBroadcast(context,System.currentTimeMillis(), i,PendingIntent.FLAG_CANCEL_CURRENT);

这样两种意图的区别就会彼此不同而且会被触发。你可以拥有任何唯一的ID,而不是System.currentTimeMillis()