2012-04-24 2 views
38

У меня внутренний класс в качестве широковещательного приемника: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();

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 

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

+0

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

+0

Такая же ошибка. – arts777

ответ

118

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

За дополнительной информацией обращайтесь к Java Nested Classes tutorial. Вот отрывок:

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

и:

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

+0

Спасибо, это сработало для меня. Но я не могу получить доступ к полям экземпляра OuterClass из вложенного класса? Что делать, если внешний класс является представлением, и мне нужно изменить его, когда намерение получено? – arts777

+7

@RankoR: «Но я не могу получить доступ к полям экземпляра OuterClass из вложенного класса?» -- верный. «Что мне делать, если внешний класс - это представление, и мне нужно его изменить, когда оно будет получено?» - зарегистрируйте свой 'BroadcastReceiver' через' registerReceiver() 'из вашей' Activity', а не через манифест. – CommonsWare

+0

Я попытался сделать это таким образом, но он не работает, метод onReceive не вызывается. Приемник был создан правильно. Я делаю это в пакете SystemUI из Android-источника. – arts777

Смежные вопросы