如何获得可靠的Broadcastreceiver

时间:2012-09-17 19:44:50

标签: android service broadcastreceiver

我希望每次Intent.ACTION_BATTERY_CHANGED被广播时都会调用Broadcastreceiver,这样我就可以跟踪一些数据。

我现在拥有的:

public class ReceiverApplication extends Application {

    @Override
    public void onCreate() {
        // Register Receiver
    }
    public static BroadcastReceiver myReceiver = new BroadcastReceiver()  {

        @Override
        public void onReceive(Context context, Intent intent) {
            // Start Service to progress data
        }       
    };  
}

这很好用直到我使用最近的应用程序“Taskmanager”来刷掉我的一个偏好屏幕或我的主要活动。然后BroadcastReceiver不再被调用。如果我启动其中一个活动,则调用ReceiverApplication的onCreate()并再次开始工作。

我可以通过让空服务一直运行来解决这个问题。通过滑动一个活动似乎没有杀死该服务,并且在一段时间后调用onCreate()并重新启动BroadcastReceiver而不做任何事情。这里的问题是我不希望服务一直运行。

那么,如果用户想要的话,我怎样才能在任何可以接收广播的Acitivity或Service之外获得Broadcastreceiver?

3 个答案:

答案 0 :(得分:2)

  

我希望每次Intent.ACTION_BATTERY_CHANGED被广播时都会调用Broadcastreceiver,这样我就可以跟踪一些数据。

此广播可能会发送很多。因此,Android只允许运行的应用程序接收这个广播,所以它不需要分叉一堆进程只是为了告诉一堆应用程序“嘿,电池电量发生了变化”。

  

这很好用直到我使用最近的应用程序“Taskmanager”来刷掉我的一个偏好屏幕或我的主要活动。然后BroadcastReceiver不再被调用。

该行为将终止您的流程。

  

那么,如果用户想要的话,我怎样才能在任何可以接收广播的Acitivity或Service之外获得Broadcastreceiver?

通常,您将在清单中注册广播。对于ACTION_BATTERY_CHANGED,这是不可能的。

请记住,您可以民意调查 ACTION_BATTERY_CHANGED - 而不是使用实际registerReceiver()来调用BroadcastReceiver,而是传递nullregisterReceiver()的返回值将是 last ACTION_BATTERY_CHANGED Intent。因此,如果您每隔几分钟就能找到电池电量,请使用AlarmManager每隔一段时间唤醒并检查当前的电池电量。

答案 1 :(得分:0)

不是嵌套广播接收器并动态注册它,而是在Android清单中声明一个根据文档,无法在清单中声明BATTERY_CHANGED:

  

只有通过使用Context.registerReceiver()显式注册它,才能通过清单中声明的​​组件来接收它。请参阅ACTION_BATTERY_LOW,ACTION_BATTERY_OKAY,ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED,了解发送并可通过清单接收器接收的不同电池相关广播。

我会注册一个广播接收器来接收所有这些事件:

    <receiver
        android:name="MyBroadcastReceiver">
        <intent-filter>
            <action
                android:name="android.intent.action.BATTERY_LOW" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action
                android:name="android.intent.action.BATTERY_OKAY" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action
                android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action
                android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            <category
                android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

无论您的应用是否正在运行,广播接收器都会收到通知。

答案 2 :(得分:0)

除了已经做出的答案之外,当您使用任务管理器“轻扫”时,您的应用停止正常工作是正常的。任务管理器将停止它,因为用户要求它。

如果您不想停止活动的生命周期,请不要这样做......您的应用程序将调用onPause()方法,如果需要,还可以调用其他方法,并且您的broacast仍然可用如果用户实际上没有使用您的应用程序。任务管理器将终止应用程序和所有“相关”线程。

如果您想了解有关活动生命周期的一些详细信息,请查看官方文档:http://developer.android.com/reference/android/app/Activity.html