当我的应用程序在后台运行时,为什么我的广播接收器未注册?

时间:2014-03-28 15:34:18

标签: android broadcastreceiver google-cloud-messaging

我在我的活动中注册了一个BroadcastReceiver,用于处理当消息到达时由GCMBaseIntentService发送的广播。当我的应用程序在foregound中运行时,一切正常,但是在很长一段时间后,即使我不注销接收器我的活动也没有工作正常(不接收广播)。我该如何解决?

首先,这是我第一次使用BroadcastReceiver这是我的代码:

<receiver
     android:name="com.google.android.gcm.GCMBroadcastReceiver"
     android:permission="com.google.android.c2dm.permission.SEND" >
     <intent-filter>
         <action android:name="com.google.android.c2dm.intent.RECEIVE" />
         <category android:name="dim.taxigen.taxigen_driver"/>
     </intent-filter>
 </receiver>

在清单中。

registerReceiver(mreceiver, new IntentFilter(
             "dim.taxigen.taxigen_driver.DISPLAY_MESSAGE"));

以及我如何在我的活动中注册。

2 个答案:

答案 0 :(得分:1)

我认为您不会以编程方式在清单中声明BroadcastReceiver。这很可能是你的问题,因为如果你的应用程序在后台,它可能会在内存不足的任何时刻被杀死。它在背景中的时间越长,就越有可能被杀死。

您可以在xml中声明BroadcastReceiver,如下所示:

<receiver android:name="com.example.Receiver" >
        <intent-filter>
            ... // Put the broadcasts you want to receive here
        </intent-filter>
 </receiver>

只需将其放入清单中的应用程序标记即可。

答案 1 :(得分:0)

首先,如果您在活动中注册了BroadcastReceiver,那么当onStop() / onPause()被调用时,您应该删除广播,因为如果您的应用在后台运行很长一段时间<{1}}可能被摧毁的时间。

如果您希望应用程序始终接收广播,则应在清单中注册接收方对象。

类似的东西:

Activity

然后在您的应用程序中创建一个名为<receiver android:name="com.smm.receivers.NewMessageReceiver" > <intent-filter> <action android:name="com.smm.action.message_received" /> </intent-filter> </receiver> 的对象,该对象将始终处理您的广播。

希望有所帮助