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

4

我有一个BroadcastReceiver的问题。如果我在清单文件中这样声明action:

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

}

}

3个回答

10

将该类设置为静态类,否则它会被视为原始包含类实例的一部分。

因此:

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

https://dev59.com/d2kv5IYBdhLWcg3w3Eal#10305338


3
将BroadcastReceiver变成静态类是不好的架构设计。这将防止您在其中调用许多方法,包括startActivity - IgorGanapolsky

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

    }
}

虽然我不确定保留非空构造函数是否会产生相同的错误。如果确实如此,您将不得不将其删除。


如果接收器已经在清单文件中,为什么还要注册接收器? - clauub

-4

需要空构造函数

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

这不是一个空构造函数。 - Roberto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接