有一种声明BroadcastReceiver的好方法吗?

时间:2013-06-12 22:04:36

标签: java android broadcastreceiver android-broadcast

我在此网站上看到了用于扫描WIFI网络的代码:http://www.androidsnippets.com/scan-for-wireless-networks

我在网站上实现了代码。它工作正常,但是当我将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 个答案:

答案 0 :(得分:1)

有多种方法可以实例化一个类,包括你提到的所有类。您选择哪一个取决于您要完成的任务,因此没有“最佳”选项。我试图避免匿名课程(你的第二个提议),因为它们不像其他选项那么明显。

当你的应用收到你的接收者注册的广播意图时,系统会调用BroadcastReceiver.onReceive方法。

一旦onReceive()完成,BroadcastReceiver就会被销毁。你不能指望它保存它的任何状态。 BroadcastReceiver的参考文档中描述了完整的接收器生命周期。

因此,一旦onReceive结束,wifiList就不再存在。

使用广播接收器接收消息并决定要做什么。不要将处理放在广播接收器中;相反,调用方法。这意味着定义广播接收器的一个好选择是使其成为Activity(或Fragment)的内部类,它允许接收者调用Activity或Fragment中的方法。