2

我正在构建一个警报应用程序。当警报启动意图时,接收器会在“魔术”发生的地方启动。不知何故,onReceive()广播接收器内部的方法被多次调用。

任何想法为什么会发生?

编辑:

仅当屏幕关闭时才调用一次以上,如果屏幕打开则不会发生。当屏幕关闭时,我调用此代码将其打开:

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock");
kl.disableKeyguard();

WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
                                   PowerManager.ACQUIRE_CAUSES_WAKEUP | 
                                   PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
wakeLock.acquire();

我究竟做错了什么?在AndroidManifest.xml我使用此代码注册广播接收器:

<receiver android:name="com.xxx.xxx.myAlarmReceiver" >
     <intent-filter>
          <action android:name="REFRESH_THIS" />
     </intent-filter>   
</receiver>

我不确定REFRESH_THIS. 但是,如果我改变它,接收器仍然会被调用不止一次。

4

1 回答 1

0

我最近正在调试一个具有相同行为的应用程序。当设备打开并且处理意图的服务在后台时,它仍然会积累消息。

您可能需要注意的一些潜在问题

  • 如果您将警报用作间隔计时器(通过 或一些不太出色的串行方法),则计时器可以在 [应用程序/服务] 未运行时(即设备关闭时 -请参阅文档setRepeating()关闭几次. 结果是多个消息在处理程序中排队,当应用程序回到前台时,处理程序将通过队列运行 - 将消耗多个警报意图。

  • 您正在使用一个扩展Service来接收意图的类,并且您使用START_REDELIVER_INTENT. 当服务处于后台任务中时:它已成功部分执行并被中断暂停。重新启动时,意图被重新传递并第二次处理。

  • recycle()您的消息 - 或者只是扩展IntentService

要调试,您可能需要

  • 为每个意图(通过addExtra(String, int))添加一个递增的额外内容,以查看一个意图是否被多次交付,或者多个意图同时被使用。

您还应该在问题中包含来自接收者的代码。

这就是我所拥有的。

于 2013-10-09T21:39:55.720 回答