Android 监听网络状态的demo Kotlin
起因:
原本是打算监听一下网络中断状态的,但发现利用广播的方法弃用了,去官网查资料是推荐使用ConnectivityManager.NetworkCallback(),而且能监听的网络状态还挺多的。
另外官网上说是支持API 21的,但IDE警告是最低支持到API 24,而亲测API 31、API 30有效,也就是android11和android12的机子测试能够监听到。(后面有通过广播的方式监听的demo)
前期处理:
网络权限是必须的,在AndroidManifest.xml里添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
操作代码
1、ConnectivityManager
2、调用registerDefaultNetworkCallback方法
3、然后像重写activity生命周期的方法一样重写NetworkCallback的onXXX方法,不需要的可以不写
class ConnectStateActivity : AppCompatActivity() {
@RequiresApi(Build.VERSION_CODES.N)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_connect_state)
//获取管理器
val connectivityManager =
getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
//注册
connectivityManager.registerDefaultNetworkCallback(object :
ConnectivityManager.NetworkCallback() {
//以下是可以监听的状态
/**
* 当框架连接并声明一个新的网络可供使用时调用。
*Called when the framework connects and
* has declared a new network ready for use.
*/
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.d(TAG, "onAvailable>>>>>start")
}
/**
*当对指定网络的访问被阻止或解除阻止时调用。
* Called when access to the specified
* network is blocked or unblocked.
*/
override fun onBlockedStatusChanged(network: Network, blocked: Boolean) {
super.onBlockedStatusChanged(network, blocked)
Log.d(TAG, "onBlockedStatusChanged>>>>>start")
}
/**
* 当与此请求对应的网络更改功能但仍满足请求的条件时调用。
* Called when the network corresponding to this
* request changes capabilities but still satisfies the requested criteria.
*/
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
super.onCapabilitiesChanged(network, networkCapabilities)
Log.d(TAG, "onCapabilitiesChanged>>>>>start")
}
/**
* 当该请求对应的网络发生变化时调用LinkProperties。
* Called when the network corresponding
* to this request changes LinkProperties.
*/
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
super.onLinkPropertiesChanged(network, linkProperties)
Log.d(TAG, "onLinkPropertiesChanged>>>>>start")
}
/**
* 当网络即将丢失时调用,通常是因为没有未完成的请求。
* Called when the network is about to be lost,
* typically because there are no outstanding requests left for it.
*/
override fun onLosing(network: Network, maxMsToLive: Int) {
super.onLosing(network, maxMsToLive)
Log.d(TAG, "onLosing>>>>>start")
}
/**
* 当网络断开连接或不再满足此请求或回调时调用。
* Called when a network disconnects or otherwise
* no longer satisfies this request or callback.
*/
override fun onLost(network: Network) {
super.onLost(network)
Toast.makeText(this@ConnectStateActivity, "网络中断", Toast.LENGTH_SHORT).show()
Log.d(TAG, "onReceive>>>>>网络中断")
}
/**
* 如果在调用中指定的超时时间内没有找到网络,
* 或者如果请求的网络请求无法完成(无论是否指定了超时),则调用。
* Called if no network is found
* within the timeout time specified in ConnectivityManager.
* requestNetwork(android.net.NetworkRequest,
* android.net.ConnectivityManager.NetworkCallback, int)
* call or if the requested network request cannot
* be fulfilled (whether or not a timeout was specified).
*
*/
override fun onUnavailable() {
super.onUnavailable()
Log.d(TAG, "onUnavailable>>>>>start")
}
})
}
}
广播形式监听网络中断
同样也需要声明网络权限
class BroadcastReceiverActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// val binding = ActivityBroadcastReceiverBinding.inflate(layoutInflater)
// setContentView(binding.root)
setContentView(R.layout.activity_broadcast_receiver)
//过滤器
val intentFilter = IntentFilter()
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
//注册监听
registerReceiver(object : BroadcastReceiver(){
//监听到广播
override fun onReceive(context: Context?, intent: Intent?) {
val connectivityManager =
context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
//网络中断了
val activeNetwork = connectivityManager.activeNetworkInfo
if (activeNetwork==null||!activeNetwork.isConnected){
Toast.makeText(context,"网络中断",Toast.LENGTH_SHORT).show()
Log.d(TAG,"onReceive>>>>>网络中断")
}
}
},intentFilter)
}
最后
官方推荐的方法底层没具体看过,粗浅猜测也是用广播的形式监听然后封装的,不一定对,有知道的朋友请告诉我一声。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgccbif
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13