Android 活动恢复后未调用BroadcastReceiver

Android 活动恢复后未调用BroadcastReceiver,android,android-activity,broadcastreceiver,lifecycle,Android,Android Activity,Broadcastreceiver,Lifecycle,首先,我是android的新手,所以这可能是一个愚蠢的问题,尽管如此,我已经花了几天时间试图找到一个解决方案 我正试图为本地化目的构建一个wifi模块,所以我编写了一个BroadcastReceiver来处理wifi扫描和本地化。当我改变屏幕方向时,当我点击Desire HD上的后退按钮,然后再次打开应用程序时,应用程序工作并完成它(在这个阶段非常简单)的工作。但是,当我按下主屏幕上的HOME键,然后再次进入我的应用程序时,广播接收器似乎不再工作,如果我关闭应用程序,就会收到一条错误消息 下面是

首先,我是android的新手,所以这可能是一个愚蠢的问题,尽管如此,我已经花了几天时间试图找到一个解决方案

我正试图为本地化目的构建一个wifi模块,所以我编写了一个BroadcastReceiver来处理wifi扫描和本地化。当我改变屏幕方向时,当我点击Desire HD上的后退按钮,然后再次打开应用程序时,应用程序工作并完成它(在这个阶段非常简单)的工作。但是,当我按下主屏幕上的HOME键,然后再次进入我的应用程序时,广播接收器似乎不再工作,如果我关闭应用程序,就会收到一条错误消息

下面是代码,部分改编自

这是广播接收机

public class WiFiScanReceiver extends BroadcastReceiver {
  private static final String TAG = "WiFiScanReceiver";
  WiFiDemo wifiDemo;
  ScanResult storedBest;

  public WiFiScanReceiver(WiFiDemo wifiDemo) {
    super();
    this.wifiDemo = wifiDemo;
    storedBest = null;
  }

 @Override
 public void onReceive(Context c, Intent intent) {
    List<ScanResult> results = wifiDemo.wifi.getScanResults();
    ScanResult bestSignal = null;
    wifiDemo.textStatus.setText(wifiDemo.header);

    for (ScanResult result : results) {
      if (bestSignal == null
         || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0)
         bestSignal = result;
      wifiDemo.textStatus.append("\n\n" + result.toString());
    }

      if ( storedBest == null || ((bestSignal.SSID.compareTo(storedBest.SSID)!=0) &&  bestSignal.level>-50)){
         storedBest = bestSignal;
         String locationMessage = String.format("You are near %s's Access Point",
                 bestSignal.SSID);
         Toast.makeText(wifiDemo, locationMessage, Toast.LENGTH_LONG).show();
      }
      String message = String.format("%s networks found. %s is the strongest. Its level is %s",
         results.size(), bestSignal.SSID, bestSignal.level);
      if (wifiDemo.scanON) wifiDemo.wifi.startScan();
      Log.d(TAG, "onReceive() message: " + message);
  }

}
公共类WiFiScanReceiver扩展了BroadcastReceiver{
私有静态最终字符串标记=“WiFiScanReceiver”;
WiFiDemo WiFiDemo;
扫描结果存储测试;
公共WiFiScanReceiver(WiFiDemo WiFiDemo){
超级();
this.wifiDemo=wifiDemo;
storedBest=null;
}
@凌驾
接收时公共无效(上下文c,意图){
List results=wifiDemo.wifi.getScanResults();
ScanResult bestSignal=null;
wifiDemo.textStatus.setText(wifiDemo.header);
用于(扫描结果:结果){
if(bestSignal==null
||WifiManager.compareSignalLevel(bestSignal.level,result.level)<0)
最佳信号=结果;
wifiDemo.textStatus.append(“\n\n”+result.toString());
}
if(storedBest==null | |((bestSignal.SSID.compareTo(storedBest.SSID)!=0)&&bestSignal.level>-50)){
storedBest=最佳信号;
String locationMessage=String.format(“您靠近%s的访问点”,
bestSignal.SSID);
Toast.makeText(wifiDemo,locationMessage,Toast.LENGTH_LONG.show();
}
String message=String.format(“%s网络发现。%s是最强的。其级别为%s”,
结果.size()、bestSignal.SSID、bestSignal.level);
if(wifiDemo.scanON)wifiDemo.wifi.startScan();
Log.d(标记“onReceive()message:+message”);
}
}
您的onResume()方法已被注释掉


您确定这是正确的IntentFilter吗?

发布时,最好发布您收到的错误消息,以便我们知道您遇到的问题

也就是说,它不起作用的原因可能是因为您在onStop中注销了接收器,而只在onCreate中注册了接收器。您通常应该在匹配的生命周期阶段执行这些类型的调用

  • onCreate/onDestroy
  • 启动/停止
  • 继续/暂停

要解决您的问题,请尝试在onStart中而不是onCreate中注册接收器。

您也可以发布清单吗?最好在
onResume()
中注册并在
onPause()
中注销,以避免向暂停的活动广播(暂停时您无法处理广播)。
public class WiFiScanReceiver extends BroadcastReceiver {
  private static final String TAG = "WiFiScanReceiver";
  WiFiDemo wifiDemo;
  ScanResult storedBest;

  public WiFiScanReceiver(WiFiDemo wifiDemo) {
    super();
    this.wifiDemo = wifiDemo;
    storedBest = null;
  }

 @Override
 public void onReceive(Context c, Intent intent) {
    List<ScanResult> results = wifiDemo.wifi.getScanResults();
    ScanResult bestSignal = null;
    wifiDemo.textStatus.setText(wifiDemo.header);

    for (ScanResult result : results) {
      if (bestSignal == null
         || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0)
         bestSignal = result;
      wifiDemo.textStatus.append("\n\n" + result.toString());
    }

      if ( storedBest == null || ((bestSignal.SSID.compareTo(storedBest.SSID)!=0) &&  bestSignal.level>-50)){
         storedBest = bestSignal;
         String locationMessage = String.format("You are near %s's Access Point",
                 bestSignal.SSID);
         Toast.makeText(wifiDemo, locationMessage, Toast.LENGTH_LONG).show();
      }
      String message = String.format("%s networks found. %s is the strongest. Its level is %s",
         results.size(), bestSignal.SSID, bestSignal.level);
      if (wifiDemo.scanON) wifiDemo.wifi.startScan();
      Log.d(TAG, "onReceive() message: " + message);
  }

}