我制作了一个接口来从广播接收器获取触发器,但是它总是说接口对象具有空值!
这是定义接口的广播接收器类的代码:
public class GeofenceBroadcastReceiver extends BroadcastReceiver {
public interface ResultListener {
public void SomeWorkToDo();
}
private ResultListener resultListener;
public void setter(ResultListener listener){
Log.i("setter","working");
this.resultListener=listener;
}
@Override
public void onReceive(Context context, Intent intent) {
GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
if (geofencingEvent.hasError()) {
Toast.makeText(context, "error", Toast.LENGTH_SHORT).show();
return;
}
int geofenceTransition = geofencingEvent.getGeofenceTransition();
if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_DWELL) {
Log.i("Geo Fencing broadcast","Running");
Toast.makeText(context, "You Are Arrived!!!", Toast.LENGTH_SHORT).show();
resultListener.SomeWorkToDo();
}else {
Toast.makeText(context, "something went wrong", Toast.LENGTH_SHORT).show();
}
}
这是清单文件的代码:
<receiver android:name=".GeoFencing.GeofenceBroadcastReceiver" />
此代码在MainActivity中使用:
GeofenceBroadcastReceiver geofenceBroadcastReceiver=new GeofenceBroadcastReceiver();
geofenceBroadcastReceiver.setter(new GeofenceBroadcastReceiver.ResultListener() {
@Override
public void SomeWorkToDo() {
Log.i("our interface","working");
startActivity(new Intent(ViewPlace.this,ViewDirections.class));
finishAffinity();
}
});
您正在清单中注册接收者。您的new GeofenceBroadcastReceiver()
将不被使用。接收到该接收器的广播时,Android将创建其自己的GeofenceBroadcastReceiver
实例。结果,回调将为null
,因为未调用您的setter。
对于您要解决的任何问题,使用系统广播很可能是错误的解决方案。如果您确信系统广播是正确的答案,并且希望将接收者保留在清单中,则GeofenceBroadcastReceiver
需要能够自行完成其所有工作,而没有其他对象的任何回调。