【发布时间】:2012-11-24 07:20:11
【问题描述】:
我希望我的所有活动都了解电源状态:是否连接了充电器?当注册的接收者收到ACTION_POWER_CONNECTED 或ACTION_POWER_DISCONNECTED 时,会回调该活动以通知已注册的活动。因为我想要应用程序的所有活动,并且我使用这个回调方法,所以我创建了一个接口,强制活动实现 powerDisconnected() 和 powerConnected();
public interface BrightnessActivityInterface {
void powerDisconnected();
void powerConnected();
}
因为我的活动都使用相同类型的代码(例如,连接时屏幕打开和亮锁,而断开电源时屏幕变暗)我扩展了class Activity并实现了BrightnessActivityInterface:
public class BrightnessActivity extends Activity implements BrightnessActivityInterface {
private ChargingOffReceiver chargingOff;
private ChargingOnReceiver chargingOn;
public BrightnessActivity(){
chargingOn = new ChargingOnReceiver(this);
registerReceiver(chargingOn, new IntentFilter(Intent.ACTION_POWER_CONNECTED));
chargingOff = new ChargingOffReceiver(this);
registerReceiver(chargingOff, new IntentFilter(Intent.ACTION_POWER_DISCONNECTED));
}
@Override
public void onResume() {
super.onResume();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
@Override
public void onPause() {
super.onPause();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
public void powerDisconnected() {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
public void powerConnected() {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
我所有的活动现在都扩展了这个 BrightnessActivity 而不是 Activity。到目前为止听起来一切都很好?
问题是我开始的第一个活动我在该行之后得到一个空指针
registerReceiver(chargingOn, new IntentFilter(Intent.ACTION_POWER_CONNECTED));
'this' 有一个值(它是我的启动活动),而chargingOn 是一个 ChargingOnReceiver。我安装了源代码,但我不知道我在看什么。
我的班级有权注册到ACTION_POWER_CONNECTED,并且它工作正常,直到我从BrightnessActivity而不是Activity派生我的所有班级。请指教。
【问题讨论】:
-
Context的Activity从其onCreate方法开始有效。您的代码还有其他缺陷。 -
使用 Activity 的构造函数显示了一些更深层次的问题,与您对 Android 的基本理解有关。
-
@WarrenFaith,您的意思是该活动到达我的构造函数时还不是一个完整的活动吗?当我的构造函数被调用时,活动应该完成。
-
@luksprog 你能指出其他一些缺陷吗?
-
1.您没有任何理由使用Activity的构造函数(使用Activity的生命周期方法) 2.与接收者相关,在
onCreate/onResume方法中注册它们 3.您永远不会取消注册接收者所以你冒着内存泄漏的风险(检查BroadcastReceiver类的文档)
标签: android interface nullpointerexception