Android AlarmManager启动两次

Android AlarmManager启动两次,android,Android,我正在尝试使用Androids AlarmManager。问题是,它一个接一个地发射两次 public class ScheduleSomething { public static void schedule(Pojo pojo) throws JsonProcessingException { final ObjectMapper mapper = new ObjectMapper(); final String pojoAsJson = mapp

我正在尝试使用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.
    }

}
当然,我已经检查了是否调用了schedule(Pojo-Pojo)方法两次,但遗憾的是,事实并非如此。现在,我正在努力解决这个问题,但迟早,我会以一种干净的方式解决这个问题。
致以最诚挚的问候,希望有人知道出了什么问题。

好的,我确信有更优雅的方法来解决我的问题,但我已经找到了一个有效的解决方案。问题是,在BroadcastReceiver截获警报后,我打了一个电话,然后又被这个BC截获(尽管这个BC没有过滤新的呼出呼叫或电话状态…)。因此,我所做的是添加另一个字符串,并在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.
    }

}

一种可能是,您可能已经在清单文件中注册了广播接收器两次,如果您使用了任何广播接收器,则在服务中注册了另一次。因为它注册了两次,所以有两个接收器实例。希望这有帮助。

在清单上指定了
意图过滤器之后,对于我的报警广播接收器,我没有问题。它确实会在错误的时间(几秒钟)触发,因为
alarm.setInexactRepeating()
,但不会像以前那样在一秒钟内触发两次

<receiver
        android:name=".AlarmReceiver"
        android:process=":remote" >
        <intent-filter>
            <action android:name="com.mine.alarm"/>
        </intent-filter>
</receiver>


我的问题是,Android Studio调试器出于某种原因“命中”了我的闹钟广播接收器的断点两次,但实际上只有在未连接调试器的情况下才执行一次代码,这听起来很愚蠢,但可能对某些人有所帮助


你可以通过记录一些东西而不是使用断点来判断。

完全卸载你的应用程序。使用adb shell dumpsys alarm
确认您不再安排任何报警。安装应用程序并运行代码以设置警报。然后再次使用adb外壳转储系统报警。如果您在其中看到应用程序的多个条目,则您正在安排多个警报。如果没有,请找出你的应用程序中还有什么触发了你的
AlarmReceiver
。有一大堆预定的,但没有一条Intentrecord提到我的软件包名称,其中大多数是指com.google.android.calendar和com.google.android.gms以及其他与谷歌服务相关的内容。在这样做的同时,我意识到我并没有注册一个意向过滤器来过滤我自己的包标识符。我想这是根本原因,对吗?以上评论的补充:这正是问题所在。当然,每次有值得拦截的东西进来时,BC都会触发。我会尽快更新我的代码。”在这样做的同时,我意识到我没有注册一个用于过滤我自己的包标识符的意图过滤器。我想这是根本原因,对吧?”--不。您使用的是显式的
意图
,因此不需要
。但是,如果您确实有一个
,那么您额外的
onReceive()
调用可能来自与该筛选器匹配的其他广播。不确定如何处理此问题,但我通过在schedule()方法中声明的意图中添加另一个额外内容来解决此问题,请在BC中检查该额外内容,如果没有,请退出哈哈哈,是的,它发生了!