Подтвердить что ты не робот

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

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

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 intent = new Intent();

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

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

4b9b3361

Ответ 1

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

Ознакомьтесь с учебным пособием по Java-вставкам. Вот фрагмент:

Экземпляр InnerClass может существовать только в экземпляре OuterClass и имеет прямой доступ к методам и полям охватывающий экземпляр. Следующий рисунок иллюстрирует эту идею.

и

Вложенный класс является членом его охватывающего класса. Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам класса, даже если они объявлены частными. Статические вложенные классы не имеют доступ к другим членам охватывающего класса. Как член OuterClass, вложенный класс может быть объявлен закрытым, общедоступным, защищенный или закрытый пакет. (Напомним, что внешние классы могут быть объявленный открытый или закрытый пакет.)