具有不同意图但相同ID的挂起意图

7

我有两个待处理的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);

我在我的应用程序中以不同的方式使用这两个。

我的问题是:

这些pendingIntent是否彼此不同?因为意图不同但ID相同

如果我为每个挂起的Intent设置闹钟管理器,它们会同时触发还是一个会替换另一个?


在不同的方法中,您可以为多个实例设置相同的id,因为每个id的作用域仅限于方法体内部。但是当您在外部访问它时,它将取决于运行时可访问性,即哪个实例系统调用,并相应地执行下一个任务。 - Vickyexpert
你的意思是它们不同吗? - mj7000
从文档中:用于匹配的Intent部分与Intent.filterEquals定义的部分相同。如果您使用两个Intent对象,这两个对象根据Intent.filterEquals是等效的,则您将为它们都获得相同的PendingIntent。 - pskink
3个回答

5

因此,最简单的方法就是自己直接测试。
我在我的计算机上进行了测试,以下是我得到的结果:

这些PendingIntents是否不同?因为意图是不同的,但Id相同。

-是的,尽管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”实际上是“请求代码(request code)”。它用于取消待处理的意图(pending intent)。


谢谢你的回复,我也自己测试了一下,但我想要一个确定和确切的答案,不管怎样还是感谢。 - mj7000
如果我只使用一个AlarmReceiver类来处理这种情况会怎样? - user9373603
1
@JimmyTrivedi 是的,你可以只使用一个单独的 AlarmReceiver 类来处理不同的 PendingIntent,但是请确保请求代码是唯一的,这样每个 PendingIntent 都将始终调用 AlarmReceiver 类。否则,AlarmReceiver 类只会被调用一次。 - HendraWD
@HendraWD 这就是问题所在。我想要为相同的ID执行操作。 - user9373603
1
@JimmyTrivedi 如果您希望每个创建的“PendingIntent”始终调用“AlarmReceiver”,请使用不同的请求代码。否则,如果使用相同的请求代码,它将覆盖具有相同请求代码的先前的“PendingIntent”。我希望我的解释足够清楚。 - HendraWD

3

Intents是指与PendingIntent绑定执行的动作,但触发条件完全取决于PendingIntent本身,RequestCode在此起到了唯一标识、管理和触发PendingIntent的良好作用。

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


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


在我的情况下,我有两个表格数据库,一个用于警报,另一个用于通知,并且我使用每个ID(自动递增)作为待处理意图的ID,也许这些ID会相互冲突!!!因为有两个表格。 - mj7000

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