web-dev-qa-db-fra.com

BroadcastReceiver: impossible d'instancier la classe; pas de constructeur vide

J'ai une classe interne comme récepteur de diffusion:

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>

Et quand j'envoie l'intention avec ce code: Intention intention = new Intent ();

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

Je reçois ces exceptions:

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

Mais j'ai un constructeur vide! Pourquoi ça ne marche pas?

38
int_32

Vous devez déclarer votre classe interne comme statique. Sinon, une classe interne est associée à une instance de votre classe externe.

Consultez le tutoriel Java Nested Classes pour plus de détails. Voici un extrait:

Une instance de InnerClass ne peut exister que dans une instance de OuterClass et a un accès direct aux méthodes et aux champs de son instance englobante. La figure suivante illustre cette idée.

et:

Une classe imbriquée est membre de sa classe englobante. Les classes imbriquées non statiques (classes internes) ont accès aux autres membres de la classe englobante, même si elles sont déclarées privées. Les classes imbriquées statiques n'ont pas accès aux autres membres de la classe englobante. En tant que membre de OuterClass, une classe imbriquée peut être déclarée privée, publique, protégée ou package privé. (Rappelez-vous que les classes externes ne peuvent être déclarées publiques ou privées que par package.)

121
jarrad