Android 扩展活动类,初始化时为空指针
我希望我的所有活动都了解电源状态:是否连接了充电器?当注册的接收器接收到连接的Android 扩展活动类,初始化时为空指针,android,interface,nullpointerexception,Android,Interface,Nullpointerexception,我希望我的所有活动都了解电源状态:是否连接了充电器?当注册的接收器接收到连接的操作\u电源或断开的操作\u电源时,将回调活动以通知注册的活动。由于我希望所有活动都是应用程序的一部分,并且我使用这个回调方法,所以我创建了一个接口,强制活动实现powerDisconnected()和powerConnected() 因为我的活动都使用相同类型的代码(例如,连接时屏幕打开和亮锁,断开电源时屏幕变暗),所以我扩展了类活动,并实现了BrightnessActivityInterface: public c
操作\u电源
或断开的操作\u电源
时,将回调活动以通知注册的活动。由于我希望所有活动都是应用程序的一部分,并且我使用这个回调方法,所以我创建了一个接口,强制活动实现powerDisconnected()
和powerConnected()代码>
因为我的活动都使用相同类型的代码(例如,连接时屏幕打开和亮锁,断开电源时屏幕变暗),所以我扩展了类活动
,并实现了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\u POWER\u
,在我从BrightnessActivity
而不是Activity派生出所有类之前,它运行良好。请注意。您应该在onCreate
中注册您的接收者,并在onPause中注销
API:
“您可以使用
registerReceiver()或静态发布实现
通过AndroidManifest.xml中的标记。注意:如果注册
在Activity.onResume()实现中,您应该
在Activity.onPause()中注销它。(当
暂停,这将减少不必要的系统开销)。不要
在Activity.onSaveInstanceState()中注销。“
如果您不理解为什么活动在构造函数之后没有处于“就绪”状态,那么您需要阅读一下您不应该覆盖默认的活动构造函数。将代码移动到overriden onCreate()方法。活动的上下文
从其onCreate
方法开始有效。您的代码还有其他缺陷。使用活动的构造函数表明您对android的基本理解存在一些更深层次的问题。@WarrenFaith,您的意思是当活动到达我的构造函数时,它还不是一个完整的活动吗?调用我的构造函数时,活动应该完成。@luksprog您能指出一些其他缺陷吗?1。您没有任何理由使用活动的构造函数(而是使用活动的生命周期方法)2。与接收者相关,在onCreate
/onResume
方法3中注册接收者。你从不注销接收器,所以你有内存泄漏的风险(检查BroadcastReceiver
类的文档)不,他可以重写默认构造函数,他只是不能在那里注册他的接收器。实例化您自己的对象是可以的,因为new Activity()从不直接实例化活动。那么,构造函数重写有什么意义呢?对于测试和依赖注入来说,活动性是Android框架的一部分。Android创建活动并初始化它。创建活动对象时,系统通过调用onCreate()启动生命周期。在调用onCreate()之前对“this”或活动的方法的任何调用都是有风险的。
registerReceiver(chargingOn, new IntentFilter(Intent.ACTION_POWER_CONNECTED));