3

У меня проблема с BroadcastReceiver. Если я объявляю действие в манифесте таким образом:Android BroadcastReceiver: невозможно создать экземпляр приемника - нет пустого конструктора

<receiver android:name="com.app.activity.observer.DataEntryObserver" > 
     <intent-filter> 
      <action android:name= "@string/action_db_updated" /> 
     </intent-filter> 
    </receiver> 

где в strings.xml у меня есть:

 <string name="action_db_updated">com.app.DB_UPDATED</string> 

все работает хорошо. Но если бы я изменить его на:

<receiver android:name="com.app.activity.observer.DataEntryObserver" > 
     <intent-filter> 
      <action android:name= "com.app.DB_UPDATED" /> 
     </intent-filter> 
    </receiver> 

У меня есть это исключение, так как приемник называется:

java.lang.RuntimeException: Невозможно создать экземпляр приемника com.app.activity.observer.DataEntryObserver: Java. lang.InstantiationException: невозможно создать экземпляр класса com.app.activity.observer.DataEntryObserver; не пустой конструктор

Я бы держать рабочую версию, но Play магазин не позволяет мне опубликовать приложение, потому что он ожидает строковое значение, а не переменные @ строка/..

моего приемника является OuterClass и определяется как:

public class DataEntryObserver extends BroadcastReceiver{ 

private AppUsageLoader dLoader; 


public DataEntryObserver(AppUsageLoader dLoader) { 
    this.dLoader = dLoader; 

    IntentFilter filter = new IntentFilter(
      ReaLifeApplication.ACTION_DB_UPDATED); 
    dLoader.getContext().registerReceiver(this, filter); 
} 


@Override 
public void onReceive(Context arg0, Intent arg1) { 

    // Tell the loader about the change. 
    dLoader.onContentChanged(); 

} 

}

ответ

9

Сделать класс статическим классом, иначе он будет «замечен» как часть исходного экземпляра класса.

таким образом:

public static class DataEntryObserver extends BroadcastReceiver{ 
public DeviceAdminSampleReceiver() { 
      super(); 
     } 
... 

https://stackoverflow.com/a/10305338/1285325

+2

Создание BroadcastReceiver статического класса - плохая архитектура. Это не позволит вам вызвать много методов внутри него, включая 'startActivity' –

-4

необходимость пустой конструктор

public DataEntryObserver() { 
    this.dLoader = null; 
} 
+1

вы знаете, почему? –

+0

Это не пустой конструктор. – Roberto

5

Вам нужен пустой конструктор, как это:

public class DataEntryObserver extends BroadcastReceiver{ 

    private AppUsageLoader dLoader; 

    // Empty constructor 
    public DataEntryObserver() { } 

    public DataEntryObserver(AppUsageLoader dLoader) { 
     this.dLoader = dLoader; 

     IntentFilter filter = new IntentFilter(
       ReaLifeApplication.ACTION_DB_UPDATED); 
     dLoader.getContext().registerReceiver(this, filter); 
    } 


    @Override 
    public void onReceive(Context arg0, Intent arg1) { 

     // Tell the loader about the change. 
     dLoader.onContentChanged(); 

    } 
} 

Хотя я не уверен, если хранение непустого конструктора будет генерировать ту же ошибку. Если это произойдет, вам придется удалить его.

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