Вопрос по android – BroadcastReceiver: невозможно создать экземпляр класса; нет пустого конструктора

38

У меня есть внутренний класс в качестве приемника вещания:

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

Но у меня есть пустой конструктор! Почему это не работает?

Та же ошибка. arts777
Вы пытались позвонить супер (); внутри вашего конструктора? Bobbake4

Ваш Ответ

1   ответ
121

Вы должны объявить свой внутренний класс как статический. В противном случае внутренний класс связан сinstance вашего внешнего класса.

ПроверьтеУчебник по Java для вложенных классов для деталей. Вот фрагмент:

An instance of InnerClass can exist only within an instance of OuterClass and has direct access to the methods and fields of its enclosing instance. The next figure illustrates this idea.

а также:

A nested class is a member of its enclosing class. Non-static nested classes (inner classes) have access to other members of the enclosing class, even if they are declared private. Static nested classes do not have access to other members of the enclosing class. As a member of the OuterClass, a nested class can be declared private, public, protected, or package private. (Recall that outer classes can only be declared public or package private.)

Error: User Rate Limit Exceeded arts777
Error: User Rate Limit Exceeded arts777
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededBroadcastReceiverError: User Rate Limit ExceededregisterReceiver()Error: User Rate Limit ExceededActivityError: User Rate Limit Exceeded

Похожие вопросы