2012-03-15 96 views
0

我最初通过代码在我的主要活动中注册了我的广播接收器。但是,我有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); 

难道我做错了什么?任何帮助表示赞赏。谢谢

回答

1

无法通过清单获得BroadcastReceiver的一个实例。

你可以做的是为你的定时器创建一个静态变量。

如果这不是您的问题的解决方案,那么创建一个服务,当收到一个广播时,用一些额外的Intent启动服务,指定如何开始时间(即将广播重定向到您的服务)。

+0

感谢您的支持。我会研究这2个选项。在我的情况下,有一些静态方法的定时器处理程序类可能是可以接受的,因为我希望能够尽可能简单地在整个应用程序中使用单个定时器。我首先使用intent广播的基本原理是,我不必将定时器对象深入到代码中。然而,我认为一个正确实现的定时器处理程序,允许其他对象通过静态方法启动定时器将是好的:) – jtnire 2012-03-15 05:17:55

1

这是BroadcastReceivers的工作方式。检查出http://developer.android.com/reference/android/content/BroadcastReceiver.html,特别是标题为“接收器生命周期”的部分:

“BroadcastReceiver对象仅在调用onReceive(Context,Intent)期间有效。一旦代码从此函数返回,系统会认为该对象

这对你在onReceive(Context,Intent)实现中可以做什么有重要影响:任何需要异步操作的东西都不可用,因为你需要从函数返回到处理异步操作,但此时BroadcastReceiver不再处于活动状态,因此系统可以在异步操作完成之前自由地终止其进程。“

从我所看到的情况来看,这在清单中注册BroadcastReceiver时看起来更糟糕。