【问题标题】:BroadcastReceiver: can't instantiate class; no empty constructorBroadcastReceiver:无法实例化类;没有空的构造函数
【发布时间】:2012-04-24 20:07:41
【问题描述】:

我有内部类作为广播接收器:

public class ManualBacklightReceiver extends BroadcastReceiver {

    public static final String ACTION_MANUAL_BACKLIGHT = "com.android.systemui.statusbar.powerwidget.MANUAL_BACKLIGHT";

    public ManualBacklightReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("ManualBacklightReceiver", intent.getAction());
    }

};

AndroidManifest:

<receiver android:name=".statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver">
        <intent-filter>
            <action android:name="com.android.systemui.statusbar.powerwidget.MANUAL_BACKLIGHT"/>
        </intent-filter>            
    </receiver>

当我使用此代码发送意图时: Intent 意图 = new Intent();

intent.setAction("com.android.systemui.statusbar.powerwidget.MANUAL_BACKLIGHT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.sendBroadcast(intent);

我得到了这些例外:

java.lang.RuntimeException: Unable to instantiate receiver com.android.systemui.statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver:
java.lang.InstantiationException: can't instantiate class com.android.systemui.statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver; no empty constructor
Caused by: java.lang.InstantiationException: can't instantiate class com.android.systemui.statusbar.powerwidget.PowerWidgetGrid$ManualBacklightReceiver; no empty constructor

但是我有一个空的构造函数!为什么它不起作用?

【问题讨论】:

  • 你试过调用 super();在你的构造函数里面?

标签: android broadcastreceiver


【解决方案1】:

你需要将你的内部类声明为静态的。否则,内部类与外部类的 instance 相关联。

查看Java Nested Classes tutorial 了解详情。这是一个sn-p:

InnerClass 的实例只能存在于 OuterClass 并可以直接访问其方法和字段 封闭实例。下图说明了这个想法。

和:

嵌套类是其封闭类的成员。非静态嵌套 类(内部类)可以访问封闭的其他成员 类,即使它们被声明为私有。静态嵌套类不 可以访问封闭类的其他成员。作为其中的一员 OuterClass,一个嵌套类可以声明为私有、公有、 受保护,或包私有。 (回想一下,外部类只能是 声明为公共或包私有。)

【讨论】:

  • 谢谢,这对我有用。但是我不能从嵌套类访问 OuterClass 实例的字段?如果outer class是view,在收到intent的时候需要修改怎么办?
  • @RankoR:“但我无法从嵌套类访问 OuterClass 实例的字段?” - 正确的。 “如果外部类是视图,我需要在收到intent时修改它怎么办?” -- 通过registerReceiver() 从您的Activity 注册您的BroadcastReceiver,而不是通过清单。
  • 我试图这样做,但它不起作用,方法 onReceive 没有被调用。接收器已正确创建。我是在 Android 源代码的 SystemUI 包中做的。
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多