我已经被困了3天了,或者我想做的事情是非常基本的或非常复杂,因为我似乎无法在任何地方找到答案。我有一个BroadcastReceiver和一个发送意图启动该广播的按钮,每次我点击它发送不同数据的按钮(int ++),意图有一个10m的计时器,所以我有两个问题:
1:要发送数据我必须使用sendBroadcast(intent)
但是要设置定时器我必须使用AlarmManager,只需将数据放入intent和intent中AlarmManager使它始终发送插入的第一个数据,我该如何解决这个问题?
2:我想让同一个BroadcastReceiver的多个实例同时进行Alarms计数,而不会互相干扰。案例:用户创建1个警报,5米后创建另一个警报,发生的事情是在设置第二个警报后10米处执行一个警报,覆盖第一个警报,预定结果是在设置后10米执行第一个警报第一个并在设置第二个之后执行第二个,我该如何实现?
我的broadcastReceiver:
public class Broadcast_RemoveClass extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int i = intent.getExtras().getInt("mInt");
Toast.makeText(context, "done"+i, Toast.LENGTH_LONG).show();
}
}
将意图发送到onClick:
public void startAlert(int i) {
Intent intent = new Intent(getActivity(), Broadcast_RemoveClass.class);
Bundle bd = new Bundle();
bd.putInt("mInt", i);
intent.putExtras(bd);
// getActivity().sendBroadcast(intent);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity().getApplicationContext(), 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000 * 60 * 10, pendingIntent);
Toast.makeText(getActivity(), "countdown started " ,Toast.LENGTH_SHORT).show();
}
大家请帮忙,即使只是其中一个问题
答案 0 :(得分:1)
当你这样做时:
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity().getApplicationContext(), 0, intent, 0);
第一个0充当此待处理意图的id。这样您可以取消它或将来更新它。如果您向具有相同ID(和相应标志)的系统发送另一个待处理意图,则它将替换前一个意图。因此,使用不同的ID发布您的新待处理意图。你在所有情况下使用硬编码的0 ....
此行为也由最后设置的标志控制。您已将此值设置为0.这没有意义...... PendingIntent类中没有公共静态最终字段,其值为0。切勿对标志使用硬编码值。即使它们具有有效值,它们也会使代码极其混乱。根据您要执行的操作,将最后的0替换为相应的标志。 PendingIntent类中的可用标志是:
int FLAG_CANCEL_CURRENT
Flag indicating that if the described PendingIntent already exists, the current one should be canceled before generating a new one.
int FLAG_IMMUTABLE
Flag indicating that the created PendingIntent should be immutable.
int FLAG_NO_CREATE
Flag indicating that if the described PendingIntent does not already exist, then simply return null instead of creating it.
int FLAG_ONE_SHOT
Flag indicating that this PendingIntent can be used only once.
int FLAG_UPDATE_CURRENT
Flag indicating that if the described PendingIntent already exists, then keep it but replace its extra data with what is in this new Intent.
您不需要广播接收器的第二个实例。同一个广播接收器可以处理你想要的所有意图。