【问题标题】:Informing my main Activity of changes in power state from a BroadcastReceiver从广播接收器通知我的主要活动电源状态的变化
【发布时间】:2013-03-21 23:31:16
【问题描述】:
我正在构建一个 Android 信息亭应用程序,该应用程序几乎可以 24/7 全天候运行,用于播放视频的小型客户端工作。但是我发现在某些时候电源可能会关闭,这意味着平板电脑需要在断电时停止运行应用程序(或至少移除屏幕保持活动状态),并在断电时重新设置所有设置。电源重新打开,因此它不会完全杀死设备。我以前做过一些 Android 工作,但没有像这样。鉴于我只有一个活动,并且当我收到状态时,活动将运行到我的广播接收器中的 onReceive 调用(我已经在我的清单文件中注册)什么是最佳实践/最惯用的方式对我来说将更改后的状态传达给我的 Activity?
我见过的当前方法包括在 Activity 中公开提供对 Activity 的静态引用,并使用它与 Activity 进行通信(根据应用程序的生命周期将其适当地设置为 self 或 null)。这是最有效的方法吗?
【问题讨论】:
标签:
android
android-activity
broadcastreceiver
【解决方案1】:
最简单的方法是创建Observer/Observable 模式,其中您的BroadcastReceiver 实现Observable,并通知所有相关方有关更改。对电源更改感兴趣的活动(或其他类)可以注册为Observer,并在发生某些事情时通过其update() 函数调用。
别忘了在onPause() 中取消注册Observer,这样你的死活动就不会被调用。
【解决方案2】:
@Hoan Nguyen 是对的。您的活动可以注册电池事件。这是一个例子:
public class Test extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final TextView text = new TextView(this);
setContentView(text);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean charging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
text.setText(charging ? "Charging" : "On battery");
}
}, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
}
@lenik 可能也是正确的,您应该在 onResume()/onPause() 而不是 onCreate() 中注册/取消注册,但以上内容应该可以帮助您入门。