获得一个BroadcastReceiver比它的活动更长久

时间:2012-07-25 16:37:58

标签: java android broadcastreceiver

我在Android应用上工作,应该只是在通知栏中发布一些有关电池的信息。我开始这个项目就像所有建议的教程一样:

  • 我创建了一个BroadcastReceiver。它处理UI的东西。
  • 然后我创建了一个IntentFilter,它只过滤了 ACTION_BATTERY_CHANGED意图
  • 然后我只是注册了IntentFilter和BroadcastReceiver实例 使用我的主要Activity的registerReceiver()方法。

它工作得很好,直到Activity(注册了两个)停止。通过停止我的意思,我按下手机上的后退按钮,我假设调用onStop()或/和onDestroy()方法。

我的问题是,如何在活动结束后让BroadcastReceiver运行,并且只有当我'强制关闭'应用程序时才停止接收?

更新

好的,从以前的答案我认为,我需要做的是从清单文件启动我的BroadcastReciever,而不是从Activity启动。这是我试图做的,但它根本没有开始接收:

<receiver android:name="com.battery.indicator.BatteryReciever" android:enabled="true" >
    <intent-filter>
        <action android:name="android.intent.action.BATTERY_CHANGED" ></action>
    </intent-filter> 
</receiver>

name属性是我的Reciever类的整个包路径。 动作名称是Eclipse的intellisense找到的。所有这些都在xml的<application></application>部分。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

创建服务并在Manifest中注册您的接收器。然后,即使您的应用程序当前已关闭,Android也会唤醒并呼叫您的接收方。

答案 1 :(得分:0)

如果你在Manifest中声明你的BroadcastReceiver(而不是代码),并且如果接收Boot已经完成,那么它将永远存在。

在清单文件中这样:

        <receiver android:name=".BootReceiver">  
         <intent-filter>  
             <action android:name="android.intent.action.BOOT_COMPLETED" />  
         </intent-filter>  
    </receiver>

注意:您需要此权限才能执行此操作:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>  

答案 2 :(得分:0)

我不确定这是否有帮助,但这是我设置清单的方式。

<manifest xmlns:android="http://schemas.android.com./apk/res/android"
          package="com.namespace"
          versionCode, etc>

   //List permissions you use, looks like there is one for battery stats
   <uses-permission android:name="android.permission.BATTERY_STATS" />

   <application>
     <receiver android:name=".broadcast_recievers.BatteryReciever">
       <action android:name="android.intent.action.BATTERY_CHANGED" />
     </receiver>
   </application>
</manifest>

我要说明的主要区别是您在清单标记中声明项目名称空间/包,然后在接收方名称中声明类的路径。在我的例子中,我将在com.namespace.broadcast_recievers中有一个名为BatteryReciever的类。

您必须进行研究以确定是否需要包含权限。这篇SO帖子暗示你没有。