【问题标题】:Extended Activity class, nullpointer on init扩展的 Activity 类,初始化时的空指针
【发布时间】:2012-11-24 07:20:11
【问题描述】:

我希望我的所有活动都了解电源状态:是否连接了充电器?当注册的接收者收到ACTION_POWER_CONNECTEDACTION_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派生我的所有班级。请指教。

【问题讨论】:

  • ContextActivity 从其 onCreate 方法开始有效。您的代码还有其他缺陷。
  • 使用 Activity 的构造函数显示了一些更深层次的问题,与您对 Android 的基本理解有关。
  • @WarrenFaith,您的意思是该活动到达我的构造函数时还不是一个完整的活动吗?当我的构造函数被调用时,活动应该完成。
  • @luksprog 你能指出其他一些缺陷吗?
  • 1.您没有任何理由使用Activity的构造函数(使用Activity的生命周期方法) 2.与接收者相关,在onCreate/onResume方法中注册它们 3.您永远不会取消注册接收者所以你冒着内存泄漏的风险(检查BroadcastReceiver类的文档)

标签: android interface nullpointerexception


【解决方案1】:

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

【讨论】:

  • 不,他可以覆盖默认构造函数,他只是不能在那里注册他的接收器。在那里实例化你自己的对象很好
  • Activity 永远不会被 new Activity() 直接实例化。那么构造函数重写有什么意义呢?
  • 用于测试和依赖注入
  • Activity 是 Android 框架的一部分。 Android 创建活动,初始化它。创建活动对象时,系统通过调用 onCreate() 开始生命周期。在调用 onCreate() 之前对“this”或活动方法的任何调用都是有风险的。
【解决方案2】:

您应该在onCreate 注册您的接收器并在onPause 取消注册

API:onRegisterReceiver API

"你可以动态注册这个类的一个实例 Context.registerReceiver() 或静态发布实现 通过您的 AndroidManifest.xml 中的标签。注意:如果注册一个 Activity.onResume() 实现中的接收者,你应该 在 Activity.onPause() 中取消注册它。 (你不会收到意图时 暂停,这将减少不必要的系统开销)。不要 在 Activity.onSaveInstanceState() 中注销。”

如果你不明白为什么你的 Activity 在构造函数之后没有处于“就绪”状态,你需要阅读Activity Lifecycle

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多