2012-04-24 4 views
38

Ich habe innere Klasse als Rundfunkempfänger:BroadcastReceiver: Klasse kann nicht instanziiert werden; kein leerer Konstruktor

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> 

Und wenn ich die Absicht mit diesem Code senden: Intent Absicht = new Intent();

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

ich diese Ausnahmen:

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 

Aber ich habe einen leeren Konstruktor! Warum es nicht funktioniert?

+0

Haben Sie versucht, den Super() aufzurufen; in Ihrem Konstruktor? – Bobbake4

+0

Derselbe Fehler. – arts777

Antwort

118

Sie müssen Ihre innere Klasse als statisch deklarieren. Andernfalls wird eine innere Klasse einer Instanz Ihrer äußeren Klasse zugeordnet.

Überprüfen Sie die Java Nested Classes tutorial für Details. Hier ist ein Ausschnitt:

Eine Instanz von Innerclass kann nur innerhalb einer Instanz von OuterClass existieren und direkten Zugriff auf die Methoden und Felder seiner umschließenden Instanz hat. Die nächste Abbildung veranschaulicht diese Idee.

und:

Eine verschachtelte Klasse ist ein Mitglied seiner umgebenden Klasse. Nicht statische verschachtelte Klassen (innere Klassen) haben Zugriff auf andere Mitglieder der umschließenden Klasse , auch wenn sie als privat deklariert sind. Statisch verschachtelte Klassen haben keinen Zugriff auf andere Member der umschließenden Klasse. Als Mitglied der OuterClass kann eine verschachtelte Klasse als privat, öffentlich, geschützt oder Paket privat deklariert werden. (Erinnern Sie sich daran, dass äußere Klassen nur als öffentlich oder als Paket privat deklariert sein können.)

+0

Danke, das hat für mich funktioniert. Aber ich kann nicht auf die Felder der OuterClass-Instanz von der geschachtelten Klasse zugreifen? Was soll ich tun, wenn die äußere Klasse die Ansicht ist, und ich muss sie ändern, wenn die Absicht empfangen wird? – arts777

+7

@RankoR: "Aber ich kann nicht auf die Felder der OuterClass-Instanz von verschachtelten Klasse zugreifen?" -- richtig. "Was soll ich tun, wenn die äußere Klasse die Ansicht ist, und ich muss sie ändern, wenn die Absicht empfangen wird?" - Registrieren Sie Ihren 'BroadcastReceiver' über' registerReceiver() 'von Ihrer' Aktivität' und nicht über das Manifest. – CommonsWare

+0

Ich habe versucht, es so zu machen, aber es funktioniert nicht, Methode onReceive wird nicht aufgerufen. Empfänger wurde korrekt erstellt. Ich mache es im SystemUI-Paket von Android-Quelle. – arts777