意图不同但 ID 相同的未决意图
Pending intent with different intent but same ID
我有两个待处理的与警报管理器一起使用的意图,一个是:
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 彼此不同吗?因为意图不同但 ID 相同
如果我为这些未决意图中的每一个设置警报管理器,它们是同时触发还是一个替换另一个?
您可以使用相同的意图名称但使用不同的 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);
这样两种意图将彼此区别开来,并且会得到 triggered.You can have any unique id instead of System.currentTimeMillis()
Intents 只是 PendingIntent 触发后必须执行的操作。但是这个触发条件完全取决于PendingIntent本身,而RequestCode在这里起到了很好的作用,可以唯一标识、管理和触发PendingIntent。
因此,无论Intent是什么,如果requestCode重复,就会触发后面的PendingIntent。如果需要触发多个PendingIntents,requestCode必须互不相同
所以简单的方法就是自己直接测试。
我已经在我的电脑上测试过了,这是我得到的:
这些 pendingIntents 彼此不同吗?因为意图不同但 ID 相同
-是的,虽然 ID 相同,但它们彼此不同
如果我为这些未决意图中的每一个设置警报管理器,它们是同时触发还是一个替换另一个?
-两者都会被触发
下面是我的测试代码,大家可以自己复制试试
将此方法复制到您的 activity,然后调用它
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");
}
创建您的第一个接收器class
public class AlarmReceiverFirst extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v(this.getClass().getSimpleName(), "first alarm receiver is called");
}
}
创建您的第二个接收器class
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就是请求码。用于取消待处理的意图。
我有两个待处理的与警报管理器一起使用的意图,一个是:
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 彼此不同吗?因为意图不同但 ID 相同
如果我为这些未决意图中的每一个设置警报管理器,它们是同时触发还是一个替换另一个?
您可以使用相同的意图名称但使用不同的 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);
这样两种意图将彼此区别开来,并且会得到 triggered.You can have any unique id instead of System.currentTimeMillis()
Intents 只是 PendingIntent 触发后必须执行的操作。但是这个触发条件完全取决于PendingIntent本身,而RequestCode在这里起到了很好的作用,可以唯一标识、管理和触发PendingIntent。
因此,无论Intent是什么,如果requestCode重复,就会触发后面的PendingIntent。如果需要触发多个PendingIntents,requestCode必须互不相同
所以简单的方法就是自己直接测试。 我已经在我的电脑上测试过了,这是我得到的:
这些 pendingIntents 彼此不同吗?因为意图不同但 ID 相同
-是的,虽然 ID 相同,但它们彼此不同
如果我为这些未决意图中的每一个设置警报管理器,它们是同时触发还是一个替换另一个?
-两者都会被触发
下面是我的测试代码,大家可以自己复制试试
将此方法复制到您的 activity,然后调用它
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");
}
创建您的第一个接收器class
public class AlarmReceiverFirst extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v(this.getClass().getSimpleName(), "first alarm receiver is called");
}
}
创建您的第二个接收器class
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就是请求码。用于取消待处理的意图。