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

时间:2019-02-23 00:44:00

标签: android beacon rssi

我正在使用一个基于RSSI信标信号显示消息的Android应用程序。在后台扫描信标的类不是活动(但该类扩展了Application),因此我无法在该类中直接显示包含某些信息的对话框。那么如何在其他活动中捕获此类的RSSI信号,然后显示对话框?

这里是扫描信标的类中的函数:

@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

                      }

                  }
              }
         }
    });
}

1 个答案:

答案 0 :(得分:0)

要显示对话框,您需要在前台具有“活动”。对于Android应用程序,情况并非总是如此,尤其是可能通过信标检测在后台启动的应用程序。如果尚未启动任何活动,则可以从Application类(可能,但通常被认为是不好的做法)启动活动,或者在这种情况下可以简单地取消对话框。

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

private MyActivity myActivity;

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

然后在MyActivity类上创建一个方法以显示对话框:

public void show dialog() {
...
}

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

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

您可以在此站点上找到许多示例代码来实际进行对话框演示。

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