web-dev-qa-db-ja.com

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

しかし、空のコンストラクタがあります!なぜ機能しないのですか?

38
int_32

内部クラスを静的として宣言する必要があります。それ以外の場合、内部クラスは外部クラスのinstanceに関連付けられます。

詳細については、 Java Nested Classes tutorial をご覧ください。以下がスニペットです。

InnerClassのインスタンスは、OuterClassのインスタンス内にのみ存在でき、それを囲むインスタンスのメソッドとフィールドに直接アクセスできます。次の図は、このアイデアを示しています。

そして:

ネストされたクラスは、それを囲むクラスのメンバーです。非静的なネストされたクラス(内部クラス)は、プライベートであると宣言されている場合でも、囲んでいるクラスの他のメンバーにアクセスできます。静的にネストされたクラスは、包含するクラスの他のメンバーにアクセスできません。 OuterClassのメンバーとして、ネストされたクラスはprivate、public、protected、またはpackage privateとして宣言できます。 (外部クラスは、パブリックまたはパッケージプライベートのみ宣言できることを思い出してください。)

121
jarrad