BroadcastReceiver:无法实例化类;没有空的构造函数

时间:2012-04-24 20:07:41

标签: android broadcastreceiver

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

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

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

1 个答案:

答案 0 :(得分:121)

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

查看Java Nested Classes tutorial了解详情。这是一个片段:

  

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

  

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