Android WifiManager线程永远不会关闭

执行此行后:

WifiManager man = ((WifiManager) ctx.getSystemService(Context.WIFI_SERVICE)); 

将显示标有“WifiManager”的主题。 在WifiService.java第203行的Java源文件中:

  HandlerThread wifiThread = new HandlerThread("WifiService"); wifiThread.start(); mWifiHandler = new WifiHandler(wifiThread.getLooper()); 

问题是,每次我们的应用程序关闭并重新打开它会创建一个新线程,运行它5次,你有5个线程。 不知道是否有任何阻止它?

编辑

更改为getApplicationContext以确保它访问的上下文是一致的并且一切都很好。 我仍然得到一个标有“WifiService”的线程,但我在多次运行中只得到一个线程。

我相信您在启动/停止(Context) Activity中创建了一个新的WifiManager。

Context.getSystemService()中的注释

注意:通过此API获得的系统服务可能与获取它们的上下文密切相关。 …

同样来自ContextImpl.java:1478和:227

 @Override public Object getSystemService(String name) { ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); return fetcher == null ? null : fetcher.getService(this); } ... service = cache.get(mContextCacheIndex); if (service != null) { return service; } ... 

它使用映射来缓存系统服务,所以我相信如果你使用像Application这样的上下文,你就不会遇到这个问题。 我不确定这是否是解决这个问题的正确方法,但如果让线程围绕一个更大的问题解决,那么它可能值得。

使用Context.getSystemService()获取系统服务的实例时,不会调用服务的构造函数。 相反,您实际上是使用IBinder获取服务的实例,以便对其进行远程过程调用。 因此,每次获得它的实例时,都不会调用WiFiService.java的构造函数。 你到底在哪里看到这个线程popup?

我希望您的应用程序是访问WifiManager的唯一应用程序。 请同时检查一些访问WifiManager的虚拟应用程序; 在这种情况下,它不应该创建一个新的线程。