Android BroadcastReceiver:无法实例化接收器 - 没有空构造函数

Luc*_* S. 4 java android exception broadcastreceiver instantiationexception

我有一个BroadcastReceiver的问题.如果我以这种方式在清单中声明操作:

    <receiver android:name="com.app.activity.observer.DataEntryObserver" >
        <intent-filter>
            <action android:name= "@string/action_db_updated" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

我在strings.xml中的位置:

       <string name="action_db_updated">com.app.DB_UPDATED</string>
Run Code Online (Sandbox Code Playgroud)

一切顺利.但是,如果我将其更改为:

    <receiver android:name="com.app.activity.observer.DataEntryObserver" >
        <intent-filter>
            <action android:name= "com.app.DB_UPDATED" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

我有这个例外,因为接收器被调用:

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

}
Run Code Online (Sandbox Code Playgroud)

}

130*_*3r5 10

使类成为静态类,否则它将被"视为"原始包含类实例的一部分.

从而:

public static class DataEntryObserver extends BroadcastReceiver{
public DeviceAdminSampleReceiver() {
            super();
        }
...
Run Code Online (Sandbox Code Playgroud)

/sf/answers/721373691/

  • 使BroadcastReceiver成为静态类是糟糕的体系结构.它会阻止你在里面调用很多方法,包括`startActivity` (3认同)

Rob*_*rto 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();

    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我不确定保持非空构造函数是否会产生相同的错误.如果是,则必须将其删除.