我是Android编程的新手,我正在尝试理解BroadcastReceivers的概念。为了帮助自己,我只是想写一个监视Wifi信号强度的小应用程序。
现在,根据我的理解,我可以等待接收系统广播的RSSI_CHANGED_ACTION。 RSSI应该经常更改,这意味着我应该经常收到此通知...但是,我从来没有收到过一次。我已经将我的代码淡化到最低限度,因此它只是在收到通知时记录消息。
public class RssiActivity extends Activity {
public BroadcastReceiver rssiReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("Rssi", "RSSI changed");
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public void onResume() {
super.onResume();
registerReceiver(rssiReceiver, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION));
Log.d("Rssi", "Registered");
}
@Override
public void onPause() {
super.onPause();
unregisterReceiver(rssiReceiver);
Log.d("Rssi", "Unregistered");
}
}
我已经看过这篇文章Android: How to monitor WiFi signal strength,它似乎没有帮助我。我也在这里尝试了代码示例http://android-er.blogspot.com/2011/01/check-rssi-by-monitoring-of.html,它也从未更新过RSSI值。我很困惑为什么会这样。你能给我的任何帮助将不胜感激。谢谢!
答案 0 :(得分:7)
所以,我遇到了同样的问题,想要在用户走动时更新RSSI值,等等,我无法使用RSSI_CHANGED_ACTION解决它。
就像您遇到的问题一样,我的回调将无法正确调用。奇怪的是,它只在活动创建时被调用一次,然后再也没有。
在onCreate()中,注册SCAN_RESULTS_AVAILABLE_ACTION的回调。然后调用WifiManager.startScan()。
现在,在你的回调中,执行:
WifiManager wifiMan=(WifiManager)getActivity().getSystemService(Context.WIFI_SERVICE);
int newRssi = wifiMan.getConnectionInfo().getRssi();
wifiMan.startScan();
现在你有一个循环,回调启动扫描,接收结果,并启动另一次扫描。
这很糟糕,会吸引很多力量,但是,当你四处走动时,你可以看到RSSI值的变化。
(请注意,我使用onResume和onPause进行注册和取消注册,因此它只会重复扫描,例如当活动在屏幕上时浪费电池)
@Override
public void onResume() {
super.onResume();
//Note: Not using RSSI_CHANGED_ACTION because it never calls me back.
IntentFilter rssiFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
this.registerReceiver(myRssiChangeReceiver, rssiFilter);
WifiManager wifiMan=(WifiManager)getActivity().getSystemService(Context.WIFI_SERVICE);
wifiMan.startScan();
}
@Override
public void onPause() {
super.onPause();
this.unregisterReceiver(myRssiChangeReceiver);
}
/**
* Broadcast receiver to update
*/
private BroadcastReceiver myRssiChangeReceiver
= new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
WifiManager wifiMan=(WifiManager)getActivity().getSystemService(Context.WIFI_SERVICE);
wifiMan.startScan();
int newRssi = wifiMan.getConnectionInfo().getRssi();
Toast.makeText(getActivity(), ""+newRssi, Toast.LENGTH_SHORT).show();
}};
抱歉,我已经很晚了,我必须要知道我必须解决你的问题:P
答案 1 :(得分:0)
当RSSI级别发生变化时,会触发WifiManager.RSSI_CHANGED_ACTION。 I.E.你输了或赢了一个wifi吧。它不会经常发生。 我的猜测是它很粘,所以它会在注册时触发。
如上所述,我找到解决问题的最佳方法是通过WifiManager.SCAN_RESULTS_AVAILABLE_ACTION。