6

我是 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:如何监控 WiFi 信号强度,它似乎对我没有帮助。我也尝试过这里的代码示例http://android-er.blogspot.com/2011/01/check-rssi-by-monitoring-of.html并且它也从未更新过 RSSI 值。我很困惑为什么会这样。您能给我的任何帮助将不胜感激。谢谢!

4

3 回答 3

8

所以,我遇到了和你一样的问题,想要在用户四处走动时更新 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

于 2012-07-11T19:01:56.733 回答
0

WifiManager.RSSI_CHANGED_ACTION 在 RSSI 级别更改时触发。IE 你输了或赢了一个 wifi 酒吧。它不会经常发生。我的猜测是它很粘,所以它在注册时触发。

如前所述,我发现解决问题的最佳方法是通过 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 。

于 2015-02-12T20:20:14.753 回答
-1

你确定它必须触发(意思是你确定信号强度正在改变)?你读过BroadcastReciever Dokumentation 吗?

注意:如果在 Activity.onResume() 实现中注册接收器,则应在 Activity.onPause() 中取消注册。(暂停时您不会收到意图,这将减少不必要的系统开销)。不要在 Activity.onSaveInstanceState() 中取消注册,因为如果用户移回历史堆栈,则不会调用它。

尝试在您的 AndroidManifest 中注册您的接收器。

于 2012-01-03T22:06:33.747 回答