2012-04-24 14 views
38

Mam wewnętrzną klasę jako odbiornik nadanie:BroadcastReceiver: nie można utworzyć instancji klasy; nie pusty 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> 

I kiedy wysłać zamiar z tym kodem: Intent zamiarem = new Intent();

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

uzyskać te wyjątki:

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 

Ale mam pusty konstruktor! Dlaczego to nie działa?

+0

Czy próbowałeś zadzwonić do super(); wewnątrz twojego konstruktora? – Bobbake4

+0

Ten sam błąd. – arts777

Odpowiedz

118

Musisz zadeklarować swoją wewnętrzną klasę jako statyczną. W przeciwnym razie klasa wewnętrzna jest związana z instancją Twojej zewnętrznej klasy.

Aby uzyskać szczegółowe informacje, zapoznaj się z Java Nested Classes tutorial. Oto fragment:

Instancja InnerClass może istnieć tylko w instancji OuterClass i ma bezpośredni dostęp do metod i dziedzin jej załączając instancji. Następna ilustracja ilustruje ten pomysł.

oraz:

zagnieżdżone klasa jest członkiem tej klasy okalającego. Niestatyczne zagnieżdżone klasy (klasy wewnętrzne) mają dostęp do innych elementów otaczającej klasy , nawet jeśli są zadeklarowane jako prywatne. Statyczne klasy zagnieżdżone nie mają dostępu do innych elementów klasy otaczającej. Jako członek klasy OuterClass klasa zagnieżdżona może być zadeklarowana jako prywatna, publiczna, chroniona lub pakiet prywatny. (Przypomnijmy, że klasy zewnętrzne mogą być tylko zadeklarowane jako publiczne lub pakietowe.)

+0

Dzięki, to zadziałało. Ale nie mogę uzyskać dostępu do pól instancji OuterClass z klasy zagnieżdżonej? Co powinienem zrobić, jeśli zewnętrzna klasa jest poglądem i muszę ją zmodyfikować, gdy otrzymamy intencję? – arts777

+7

@RankoR: "Ale nie mogę uzyskać dostępu do pól instancji OuterClass z zagnieżdżonej klasy?" - poprawne. "Co powinienem zrobić, jeśli zewnętrzna klasa jest poglądem i muszę ją zmodyfikować, gdy otrzymamy intencję?" - zarejestruj swój 'BroadcastReceiver' przez' registerReceiver() 'z' Activity', a nie poprzez manifest. – CommonsWare

+0

Próbowałem zrobić to w ten sposób, ale to nie działa, metoda onReceive nie jest wywoływana. Odbiornik został poprawnie utworzony. Robię to w pakiecie SystemUI ze źródła Androida. – arts777

Powiązane problemy