我最初通过代码在我的主Activity中注册了我的广播接收器。但是,我有IntentServices(在后台运行)广播意图,因此需要广播接收器始终可用。我在代码中注册接收器的方法工作正常,直到按下后退按钮。然后,接收器将被取消注册,因为主要活动将被销毁。
因此,我有想法将接收器的声明移到Manifest文件中。但是,我遇到了一个奇怪的问题,每当我的代码广播一个意图时,就会创建一个新的广播接收器实例。我想要的是,广播接收器的单个实例始终可用。这是因为我的广播接收器创建并启动了一个定时器,但是如果创建了多个接收器实例,则会创建多个不好的定时器。
注意:我的广播接收器的单个实例可以处理它收到意图但计时器已经启动的情况。
这是我在清单文件中的代码:
<receiver android:name=".StartTimerBroadcastReceiver" android:enabled="true" >
<intent-filter>
<action android:name="START_TIMER" />
</intent-filter>
</receiver>
这是我的代码广播意图:
Intent broadcastIntent = new Intent("START_TIMER");
broadcastIntent.putExtra("timerID", "timer1");
sendBroadcast(broadcastIntent);
我做错了吗?任何帮助表示赞赏。感谢
答案 0 :(得分:1)
这是BroadcastReceivers的工作方式。请特别查看http://developer.android.com/reference/android/content/BroadcastReceiver.html标题为“Receiver Lifecycle”的部分:
“BroadcastReceiver对象仅在调用onReceive(Context,Intent)期间有效。一旦您的代码从此函数返回,系统会认为该对象已完成且不再有效。
这对你在onReceive(Context,Intent)实现中可以做的事情有重要的影响:任何需要异步操作的东西都不可用,因为你需要从函数返回来处理异步操作,但是那时候BroadcastReceiver不再处于活动状态,因此系统可以在异步操作完成之前自由终止其进程。“
从我所看到的情况来看,在清单中注册BroadcastReceiver时这似乎更糟。
答案 1 :(得分:1)
通过Manifest不可能有一个BroadcastReceiver实例。
你可以做的是为你的Timer创建一个静态变量。
如果这不是您的问题的解决方案,那么创建一个服务,当收到广播时,启动服务,在Intent中指定如何启动时间的一些EXTRA。(即只是将广播重定向到您的服务)。