2013-06-12 2 views
-2

Я видел этот код для сканирования сети WIFI на этом сайте: http://www.androidsnippets.com/scan-for-wireless-networks.Есть хороший способ объявить BroadcastReceiver?

Я внедрил код на веб-сайте. Он отлично работает, но когда я помещаю BroadcastReceiver во внешний класс и вызываю его в своей деятельности, мой журнал, но всегда дает nullpointer.

Я звоню BroadcastReceiver в onCreate метод, называемый по wifiReceiver.getWifiManager.startScan(), поэтому в основном он должен начать onReceive метод из моего приемника. Возможно, я ошибаюсь. Затем я вызываю wifiReceiver.getListResult, итерацию его для вывода.

Мой вопрос: что я делаю неправильно? Есть ли правильный способ сделать это? Я искал через Интернет, и я видел, как люди делают это по-разному, например:

  • вложенными внутри класса

  • этот путь

BroacastReceiver receiver=new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     do something 
    } 
}; 
  • или создайте внешний класс и назовите его

Мой простой тест, чтобы увидеть, если это работает, это мой BroadcastReceiver класс:

public class WifiReceiver extends BroadcastReceiver { 
    private List<ScanResult> wifiList; 
    private WifiManager mainWifi; 
    public void onReceive(Context c, Intent intent) { 
     mainWifi = (WifiManager) c.getSystemService(Context.WIFI_SERVICE); 
     wifiList = mainWifi.getScanResults(); 
    } 

    public List<ScanResult> getListResult(){ 
     return wifiList; 
    } 

    public WifiManager getWifiManager(){ 
     return mainWifi; 
    } 
} 

В файле манифеста, я уже заявил мой приемник и дал разрешения:

<receiver android:name=".WifiReceiver"> 
    <intent-filter> 
     <action android:name="android.net.wifi.SCAN_RESULTS" /> 
    </intent-filter>   
</receiver> 

И инстанциации моя деятельность:

WifiReceiver wifiReceiver = new WifiReceiver(); 

ответ

1

Существует множество способов создания экземпляра класса, в том числе все, что вы упомянули. Какой из них вы выбираете, зависит от того, что вы пытаетесь выполнить, поэтому нет «лучшего» варианта. Я стараюсь избегать анонимных классов (ваше второе предложение), потому что они не так очевидны, как другие варианты.

Метод BroadcastReceiver.onReceive вызывается системой, когда ваше приложение получает трансляцию, для которой зарегистрирован ваш приемник.

Как только onReceive() заканчивается, BroadcastReceiver уничтожается. Вы не можете рассчитывать на это, сохраняя любое его состояние. Полный жизненный цикл приемника описан в справочной документации для BroadcastReceiver.

В результате, как только onReceive заканчивается, wifiList больше не существует.

Использовать широковещательный приемник до получать сообщения и решать, что делать. Не помещать обработку в широковещательный приемник; вместо этого вызовите методы. Это означает, что хорошим вариантом для определения широковещательного приемника является его внутренний класс Activity (или фрагмента), который позволяет получателю вызывать методы в Activity или Fragment.

+0

Спасибо, что я искал такое объяснение. Я не знаю, почему я получил отрицательный голос, не имея никакого объяснения, но ваш ответ заставляет меня быть счастливым. – DarkVision

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