Android BroadcastReceiver: невозможно создать экземпляр приемника - нет пустого конструктора

У меня проблема с 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 не позволяет мне опубликовать приложение, потому что оно ожидает строковое значение, а не переменную @string/..

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

   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();

}

}


person Luca S.    schedule 07.02.2014    source источник


Ответы (3)


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

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

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

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

person 130nk3r5    schedule 21.01.2015
comment
Превращение BroadcastReceiver в статический класс — плохая архитектура. Это не позволит вам вызывать множество методов внутри него, включая startActivity - person IgorGanapolsky; 27.04.2016

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

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();

    }
}

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

person Roberto    schedule 27.08.2014
comment
Зачем регистрировать приемник, если он уже находится внутри манифеста? - person clauub; 31.08.2020

нужно очистить конструктор

public DataEntryObserver() {
    this.dLoader = null;
}
person ROXI    schedule 07.02.2014
comment
Это не пустой конструктор. - person Roberto; 27.08.2014