5

我希望每次 Intent.ACTION_BATTERY_CHANGED 被广播时调用一个广播接收器,以便我可以跟踪一些数据。

我现在拥有的:

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
        }       
    };  
}

这工作正常,直到我使用最近的应用程序“任务管理器”刷掉我的偏好屏幕之一或我的主要活动。然后广播接收器不再被调用。如果我开始一项活动,则会调用 ReceiverApplication 的 onCreate() 并再次开始工作。

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

那么,我怎样才能在任何可以接收用户想要的广播的活动或服务之外获得广播接收器?

4

3 回答 3

2

我希望每次 Intent.ACTION_BATTERY_CHANGED 被广播时调用一个广播接收器,以便我可以跟踪一些数据。

这种广播可能会发送很多。因此,Android 只允许正在运行的应用程序接收此广播,因此它不必为了告诉一堆应用程序“嘿,电池电量已更改”而分叉一堆进程。

这工作正常,直到我使用最近的应用程序“任务管理器”刷掉我的偏好屏幕之一或我的主要活动。然后广播接收器不再被调用。

该行为终止了您的流程。

那么,我怎样才能在任何可以接收用户想要的广播的活动或服务之外获得广播接收器?

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

Bear in mind that you can poll ACTION_BATTERY_CHANGED -- instead of calling registerReceiver() with an actual BroadcastReceiver, pass in null. The return value of registerReceiver() will be the last ACTION_BATTERY_CHANGED Intent. So, if you can get away with finding the battery level every few minutes, use AlarmManager to wake up every so often and check the current battery level.

于 2012-09-17T20:41:13.317 回答
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>

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

于 2012-09-17T19:49:45.487 回答
0

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

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

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

于 2012-09-17T20:31:27.990 回答