gpt4 book ai didi

android - Intent 在接收者调用后多次调用

转载 作者:太空狗 更新时间:2023-10-29 15:15:52 25 4
gpt4 key购买 nike

我正在构建一个闹钟应用。当警报启动一个 Intent 时,接收器将在“魔法”发生的地方启动。广播接收器中的 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。但是,如果我改变它,接收者仍然会被调用不止一次。

最佳答案

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

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

  • 如果您将闹钟用作间隔计时器(通过 setRepeating() ,或者一些不太好的串行方法)计时器[应用程序/服务]不可用时可以关闭几次正在运行(即设备关闭时 - see the doc)。结果因为有几条消息在处理程序中排队,并且当应用程序被带回前台,处理程序将运行通过队列 - 将消耗多个警报 Intent 。

  • 您正在使用一个扩展 Service 的类接收 Intent ,以及您使用 START_REDELIVER_INTENT 开始了您的服务。当。。。的时候服务在任务中后台运行:它已成功部分执行并被打断暂停。重新启动时 Intent 被重新传送并第二次处理。

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

要进行调试,您可能需要:

  • 向每个 Intent 添加递增的附加值(通过 addExtra(String, int) )以查看一个 Intent 是否被多次传送,多个 Intent 是否同时被使用。

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

这就是我所拥有的。

关于android - Intent 在接收者调用后多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12872986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com