如何在 MainActivity 和 Fragment 中正确获取 WifiManager 的实例
Posted
技术标签:
【中文标题】如何在 MainActivity 和 Fragment 中正确获取 WifiManager 的实例【英文标题】:How to properly get an instance of WifiManager in MainActivity and Fragment 【发布时间】:2016-03-30 04:35:44 【问题描述】:根据WifiManager你的android文档:
通过调用 Context.getSystemService(Context.WIFI_SERVICE) 获取此类的实例。
在 Fragment 和 MainActivity 调用中:
WifiManager wifiManager = Context.getSystemService(Context.WIFI_SERVICE);
返回错误:
无法从静态上下文引用非静态方法“getSystemService(java.lang.String)”。
在MainActivity调用中:
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
有效,但为什么文档另有说明?
有人能帮我理解为什么我们不再需要在Context
前加上前缀getSystemService()
,即使该方法属于Context
类。另外,我们为什么要投射到(WifiManager)
?这个解释将极大地帮助我,因为这不是第一次工作与文档规定的不同。
在Fragment中调用相同的:
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
返回错误:
无法解析方法'getSystemService(java.lang.String)'
由于我在上一个post 中描述的问题,我希望能够获取片段中的实例。
【问题讨论】:
【参考方案1】:使用getActivity()
方法从Fragment
调用getSystemService
方法如:
WifiManager wifiManager = (WifiManager) getActivity().
getSystemService(Context.WIFI_SERVICE);
因为getSystemService
方法来自上下文类而不是来自Fragment
【讨论】:
【参考方案2】:警告那些正在寻找Activity
而不是Fragment
、WifiManager
的解决方案的人应该使用以下方法检索:
WifiManager wifiManager = mContext.getApplicationContext()
.getSystemService(Context.WIFI_SERVICE);
在应用程序级别持有 WifiManager 相对于上下文以外的上下文将导致内存泄漏。
来自Android Developer Docs:
在
Build.VERSION_CODES.N
之前的版本中,此对象应仅 从Context#getApplicationContext()
获得,而不是从任何 其他派生上下文以避免调用中的内存泄漏 过程。
【讨论】:
以上是关于如何在 MainActivity 和 Fragment 中正确获取 WifiManager 的实例的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 的 JUnit 测试用例中获取 MainActivity 的上下文和活动?
调用 Intent 时如何保持 MainActivity 运行?
Fragment 如何从使用 http 和异步任务获取数据的 MainActivity 类中获取数据?