2012-04-24 18 views
38

tengo clase interna como receptor de radiodifusión:BroadcastReceiver: no se puede crear una instancia de clase; sin constructor vacío

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> 

Y cuando envío la intención con este código: intención Intención = new Intent();

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

Puedo obtener estas excepciones:

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 

Pero tengo un constructor vacío! ¿Por qué no funciona?

+0

Ha intentado llamar al super(); dentro de tu constructor? – Bobbake4

+0

El mismo error. – arts777

Respuesta

118

Necesita declarar su clase interna como estática. De lo contrario, una clase interna se asocia con una instancia de su clase externa.

Consulte Java Nested Classes tutorial para obtener más información. Aquí hay un fragmento:

Una instancia de InnerClass puede existir solamente dentro de una instancia de OuterClass y tiene acceso directo a los métodos y campos de su ejemplo que encierra. La siguiente figura ilustra esta idea.

y:

una clase anidada es un miembro de su clase envolvente. Las clases (clases internas) anidadas no estáticas tienen acceso a otros miembros de la clase adjunta, incluso si se declaran privadas. Las clases anidadas estáticas no tienen acceso a otros miembros de la clase adjunta. Como miembro de , OuterClass, una clase anidada se puede declarar privada, pública, protegida o paquete privado. (Recuerde que las clases externas solo pueden ser declaradas públicas o privadas).

+0

Gracias, eso funcionó para mí. Pero no puedo acceder a los campos de la instancia de OuterClass de la clase anidada? ¿Qué debo hacer si la clase externa es la vista y necesito modificarla cuando se recibe la intención? – arts777

+7

@RankoR: "¿Pero no puedo acceder a los campos de la instancia de OuterClass de la clase anidada?" - correcto. "¿Qué debería hacer si la clase externa es la vista y necesito modificarla cuando se recibe la intención?" - registra tu 'BroadcastReceiver' a través de' registerReceiver() 'desde tu' Activity', en lugar de a través del manifiesto. – CommonsWare

+0

Intenté hacerlo de esta manera, pero no funciona, no se llama al método onReceive. Receptor fue creado correctamente. Lo estoy haciendo en el paquete SystemUI de la fuente de Android. – arts777

Cuestiones relacionadas