我希望每次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?
答案 0 :(得分:2)
我希望每次Intent.ACTION_BATTERY_CHANGED被广播时都会调用Broadcastreceiver,这样我就可以跟踪一些数据。
此广播可能会发送很多。因此,Android只允许运行的应用程序接收这个广播,所以它不需要分叉一堆进程只是为了告诉一堆应用程序“嘿,电池电量发生了变化”。
这很好用直到我使用最近的应用程序“Taskmanager”来刷掉我的一个偏好屏幕或我的主要活动。然后BroadcastReceiver不再被调用。
该行为将终止您的流程。
那么,如果用户想要的话,我怎样才能在任何可以接收广播的Acitivity或Service之外获得Broadcastreceiver?
通常,您将在清单中注册广播。对于ACTION_BATTERY_CHANGED
,这是不可能的。
请记住,您可以民意调查 ACTION_BATTERY_CHANGED
- 而不是使用实际registerReceiver()
来调用BroadcastReceiver
,而是传递null
。 registerReceiver()
的返回值将是 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