AlarmManager触发两次

时间:2014-06-26 12:40:39

标签: android

我正在尝试使用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)方法,但遗憾的是,那不是它。现在,我解决这个问题,但迟早,我想以一种干净的方式解决这个问题。 最好的问候,希望有人知道出了什么问题。

4 个答案:

答案 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调试器由于某种原因两次“击中”了警报的广播接收器中的断点,但实际上,当没有调试器已附加。

您可以通过记录一些内容而不是使用断点来判断。