2012-04-24 23 views
38

私は放送受信機として内部クラス持っ番号: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.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 

をしかし、私は空のコンストラクタを持っています!なぜそれは動作しません?

+0

super();あなたのコンストラクタの中に? – Bobbake4

+0

同じエラーです。 – arts777

答えて

118

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

詳しくはJava Nested Classes tutorialをご覧ください。ここで断片である:

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

と:

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

+0

ありがとう、それは私のために働いた。しかし、入れ子クラスからOuterClassインスタンスのフィールドにアクセスすることはできませんか?外部クラスがビューである場合はどうすればよいですか?インテントを受け取ったときにそのクラスを変更する必要がありますか? – arts777

+7

@RankoR: "しかし、入れ子になったクラスからOuterClassインスタンスのフィールドにアクセスすることはできませんか?" - 正しい。 "外部クラスがビューであれば何をすればいいですか?インテントを受け取ったときにそれを変更する必要がありますか?" - マニフェストではなく、 'Activity'から' registerReceiver() 'を介して' BroadcastReceiver'を登録してください。 – CommonsWare

+0

このようにしてみましたが、うまくいきません。メソッドonReceiveは呼び出されません。レシーバーが正しく作成されました。私はAndroidのソースからSystemUIパッケージでやっています。 – arts777

関連する問題