我有一个广播员的问题。如果我以这种方式声明清单的动作:
<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;
}