我正在尝试使用Androids AlarmManager。问题是,它会一次又一次地发射。
public class ScheduleSomething {
public static void schedule(Pojo pojo) throws JsonProcessingException {
final ObjectMapper mapper = new ObjectMapper();
final String pojoAsJson = mapper.writeValueAsString(pojo);
final Intent alarmIntent = new Intent(MyApplication.getAppContext(),
PojoAlarmReceiver.class);
alarmIntent.putExtra(POJO_AS_JSON, pojoAsJson);
final PendingIntent pi = PendingIntent.getBroadcast(MyApplication.getAppContext(), 0,
alarmIntent, PendingIntent.FLAG_ONE_SHOT);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + pojo.getScheduledTime() + 10L, pi);
}
}
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// do stuff. onReceive() is being called twice, every time.
}
}
当然,我已经检查了我是否两次调用时间表(Pojo pojo)方法,但遗憾的是,那不是它。现在,我解决这个问题,但迟早,我想以一种干净的方式解决这个问题。 最好的问候,希望有人知道出了什么问题。
答案 0 :(得分:1)
一种可能性,如果你使用任何一个,你可能已经在清单文件中注册了两次广播接收器,而在服务中注册了其他一个。由于它已注册两次,因此您有两个接收器实例。希望这会有所帮助。
答案 1 :(得分:1)
我在清单上指定intent-filter
后,对于我的警报广播接收器,我没有问题。它会在某个错误的时间(几秒钟)触发,因为alarm.setInexactRepeating()
但在一秒钟内没有像之前那样两次。
<receiver
android:name=".AlarmReceiver"
android:process=":remote" >
<intent-filter>
<action android:name="com.mine.alarm"/>
</intent-filter>
</receiver>
同时检查this
答案 2 :(得分:0)
好的,我确信有更优雅的方法来解决我的问题,但我找到了一个有效的解决方法。问题是,在BroadcastReceiver拦截了警报之后,我拨打了一个电话,然后再次被这个BC拦截(尽管这个特定的BC没有过滤NEW_OUTGOING_CALL或PHONE_STATE ......)。所以我做的是添加另一个String extra并在AlarmReceiver中检查它:
public class ScheduleSomething {
public static final String SOURCE = "source";
public static void schedule(Pojo pojo) throws JsonProcessingException {
final ObjectMapper mapper = new ObjectMapper();
final String pojoAsJson = mapper.writeValueAsString(pojo);
final Intent alarmIntent = new Intent(MyApplication.getAppContext(),
PojoAlarmReceiver.class);
alarmIntent.putExtra(POJO_AS_JSON, pojoAsJson);
alarmIntent.putExtra(SOURCE, "com.mypackage.alarm");
final PendingIntent pi = PendingIntent.getBroadcast(MyApplication.getAppContext(), 0,
alarmIntent, PendingIntent.FLAG_ONE_SHOT);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + pojo.getScheduledTime() + 10L, pi);
}
}
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String source = intent.getStringExtra(RegistrationCallLogic.SOURCE);
if ((source == null) || !source.equals("com.mypackage.alarm")) {
return;
}
// do stuff. onReceive() is being called twice, every time.
}
}
答案 3 :(得分:0)
我的问题,这听起来很愚蠢,但可能会帮助某人,原因是Android Studio调试器由于某种原因两次“击中”了警报的广播接收器中的断点,但实际上,当没有调试器已附加。
您可以通过记录一些内容而不是使用断点来判断。