根据来自信标的 RSSI 信号在 Android 中显示对话框

Show dialog in Android based on RSSI signal from beacons

我正在开发一个 Android 应用程序,它根据 RSSI 信标信号显示消息。在后台扫描信标的 class 不是 activity(但 class 扩展了应用程序),所以我无法在这个 class 中直接显示包含某些信息的对话框.那么如何从这个 class 中捕获另一个 activity 中的 RSSI 信号,然后显示对话框?

这是 class 中扫描信标的函数:

@Override                                                              
public void onBeaconServiceConnect(){
    mBeaconManager.setRangeNotifier(new RangeNotifier() {

        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {                                                       
             if(beacons.size() > 0) {
                  for (Beacon beacon: beacons) {
                      if(beacon.getRssi() >= - 50) {

                         ... i want here show a dialog

                      }

                  }
              }
         }
    });
}

要显示对话框,您需要在前景中有一个 Activity。 Android 应用程序并非总是如此,尤其是可能通过信标检测在后台启动的应用程序。如果尚未启动 activity,您可以从应用程序 class 启动 activity(可能但通常被认为是不好的做法),或者在这种情况下您可以简单地取消对话。

要从您的应用程序 class 触发对话框,您需要与前台的任何 activity 进行通信。有很多优雅的方法可以做到这一点(本地 BroadcastRceivers 和各种设计模式),但最简单的是将对 Activity 的引用存储在应用程序 class 上作为成员变量,例如:

private MyActivity myActivity;

public  setMyActivity(MyActivity a) {
  myActivity = activity;
}

然后在您的 MyActivity class 上创建一个方法来显示对话框:

public void show dialog() {
...
}

最后,在您的检测代码中调用该方法:

if(beacon.getRssi() >= - 50) {
      if (myActivity != null) {
         myActivity.showDialog();
      }
 }

您可以在本网站上找到很多实际进行对话演示的代码示例。

最后一个提示:注意防止您的对话在随后的每次信标检测中每秒重复出现!你需要一些额外的逻辑