我在此网站上看到了用于扫描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();
答案 0 :(得分:1)
有多种方法可以实例化一个类,包括你提到的所有类。您选择哪一个取决于您要完成的任务,因此没有“最佳”选项。我试图避免匿名课程(你的第二个提议),因为它们不像其他选项那么明显。
当你的应用收到你的接收者注册的广播意图时,系统会调用BroadcastReceiver.onReceive方法。
一旦onReceive()完成,BroadcastReceiver就会被销毁。你不能指望它保存它的任何状态。 BroadcastReceiver的参考文档中描述了完整的接收器生命周期。
因此,一旦onReceive结束,wifiList就不再存在。
使用广播接收器接收消息并决定要做什么。不要将处理放在广播接收器中;相反,调用方法。这意味着定义广播接收器的一个好选择是使其成为Activity(或Fragment)的内部类,它允许接收者调用Activity或Fragment中的方法。