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.acp.activity.observer.dataentryobserver:java.lang.instantiationException:无法实例化com.app.app.App.act.act.act.act.act.acterive.observer.observer.dataeentryobserver;没有空构造函数

我会保留工作版本,但是Play Store不允许我发布该应用程序,因为它期望字符串值,而不是变量@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();
}

}

使该类成为静态类,否则将其作为原始包含类实例的一部分。

因此:

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

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

您需要这样的空构造函数:

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

尽管我不确定保留非空构造函数是否会产生相同的错误。如果是这样,您将必须删除它。

需要空构造函数

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

相关内容

  • 没有找到相关文章

最新更新