2015-01-08 4 views
1

Мне нужен фрагмент/активность от широковещательного приемника, но я не могу найти решение.Замечание фрагмента или действия от широковещательного приемника

Описание: Когда фрагмент запускается, мой метод проверяет, включен ли модуль GPS, если он не просит его включить его. Теперь у меня есть широковещательный приемник для gps, и когда он включен или выключен, я получаю сообщение, это работает. Но теперь мне нужно сделать что-то вроде интерфейса, и когда я получаю 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()); 
} 
+0

Если ваш фрагмент реализует интерфейс 'INotifyGpsTurnedOn', я не понимаю, почему это не сработает. Какую ошибку вы получаете? –

+0

Я не могу использовать интерфейс, потому что я не могу передать iNotifyGpsTurnedOn в конструкторе GpsLocationReceiver, это запрещено в ext. BroadcastReceiver. –

+0

Конечно, вы можете. Какую ошибку вы получаете? –

ответ

1

Это работает просто отлично. Вы можете объявить Interface и предоставить это в constuctor. Это работает до тех пор, пока вы создаете экземпляр BroadcastReceiver и не позволяйте Android делать это. Вам не нужно объявлять этот BroadcastReceiver в манифесте.

Причина, по которой вы получаете Exception: Unable to instantiate receiver no empty constructor., заключается в том, что Android пытается создать экземпляр BroadcastReceiver. (для любой причины).

+0

Спасибо, Дэвид за ваш Я не могу подтвердить, что ваше решение работает для меня, потому что я уже решил это по-другому, но я думаю, что ваше решение будет работать, и я принимаю ваш ответ. Thx на ваше время. В будущем я буду помнить ваш совет. –

Смежные вопросы