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