扩展的Activity类,init上的nullpointer

时间:2012-12-06 09:33:55

标签: android interface nullpointerexception

我希望我的所有活动都了解电源状态:是否连接了充电器?当注册的接收者收到ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED时,对该活动进行回叫以通知已注册的活动。由于我想要所有属于应用程序的活动,并且我使用此回调方法,因此我创建了一个界面,强制活动实现powerDisconnected()powerConnected();

public interface BrightnessActivityInterface {
    void powerDisconnected();
    void powerConnected();
}

因为我的活动都使用相同类型的代码(例如,连接时屏幕亮和亮锁,断电时屏幕变暗)我扩展了class Activity并实现了BrightnessActivityInterface:< / p>

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。到目前为止听起来都不错?

问题是我开始的第一个活动我在行

之后得到一个nullpointer
 registerReceiver(chargingOn, new IntentFilter(Intent.ACTION_POWER_CONNECTED));

'this'有一个值(这是我的启动活动),chargingOn是一个ChargingOnReceiver。我安装了源码,但我不知道我在看什么。

我的班级有权注册ACTION_POWER_CONNECTED,并且一直工作正常,直到我从BrightnessActivity而不是活动派生所有班级。请指教。

2 个答案:

答案 0 :(得分:1)

您不应覆盖默认的Activity构造函数。移动代码以覆盖onCreate()方法。

答案 1 :(得分:0)

您应该在onCreate注册接收者,并在onPause

中取消注册

API:onRegisterReceiver API

  

“您可以使用动态注册此类的实例   Context.registerReceiver()或静态发布实现   通过AndroidManifest.xml中的标记。注意:如果注册了   您应该在Activity.onResume()实现中使用接收器   在Activity.onPause()中取消注册它。 (你什么时候不会收到意图   暂停,这将减少不必要的系统开销。不要   在Activity.onSaveInstanceState()中取消注册。“

如果你不理解为什么你的Activity在构造函数之后没有处于'ready'状态,你需要在Activity Lifecycle上阅读