注意来自广播接收器的片段或活动

时间:2015-01-08 17:35:24

标签: java android android-fragments gps broadcastreceiver

我需要注意来自广播接收器的片段/活动,但我找不到解决方案。

说明:片段启动时,我的方法检查GPS模块是否为ON,如果没有要求用户打开它。现在我有gps广播接收器,当gps On或OFF时我得到消息,这是有效的。但是现在我需要做一些像界面这样的事情,当我开启/关闭GPS时,我想在片段中调用我的方法。我不确定我是否清楚我需要什么。在这里我尝试使用接口,但后来我发现所以我不能将接口对象传递给广播接收器构造函数。

我的界面解决方案但不起作用:

    public class GpsLocationReceiver extends BroadcastReceiver {

    private INotifyGpsTurnedOn iNotifyGpsTurnedOn = null;

    public GpsLocationReceiver(INotifyGpsTurnedOn iNotifyGpsTurnedOn) {
        this.iNotifyGpsTurnedOn = iNotifyGpsTurnedOn;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        LocationManager lm = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE);
        boolean isEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        Toast.makeText(context, isEnabled+"",
                Toast.LENGTH_SHORT).show();

        if(isEnabled){
            iNotifyGpsTurnedOn.iniGps();
        }
        else{
            iNotifyGpsTurnedOn.askTurnOnGps();
        }
    }

    public interface INotifyGpsTurnedOn {
        public void iniGps();
        public void askTurnOnGps();
    }
}

在片段类中,我实现了与方法,寄存器接收器等的接口......

 GpsLocationReceiver m_gpsChangeReceiver = new GpsLocationReceiver(this);
    getActivity().registerReceiver(m_gpsChangeReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));

    @Override
public void iniGps() {
    mGps.startGps(false);
}

@Override
public void askTurnOnGps() {
    mGps.askUserToTurnOnGPS(getActivity());
}

1 个答案:

答案 0 :(得分:1)

这很好用。您可以声明Interface并在构造函数中提供此内容。只要您自己实例化BroadcastReceiver,并且不让Android执行此操作,这就可以正常工作。您无需在清单中声明此BroadcastReceiver

您获得Exception: Unable to instantiate receiver no empty constructor.的原因是因为Android正在尝试实例化BroadcastReceiver。 (无论出于何种原因)。