Broadcast receiver for checking internet connection in android app

后端 未结 21 3232
温柔的废话
温柔的废话 2020-11-21 22:28

I am developing an android broadcast receiver for checking internet connection.

The problem is that my broadcast receiver is being called two times. I want it to get

21条回答
  •  自闭症患者
    2020-11-21 22:32

    Here's a comfortable way to do it for activity, fragment or context. It will also auto-unregister if you do it for activity/fragment (in onDestroy), if you wish:

    abstract class ConnectionBroadcastReceiver : BroadcastReceiver() {
        companion object {
            @JvmStatic
            fun registerWithoutAutoUnregister(context: Context, connectionBroadcastReceiver: ConnectionBroadcastReceiver) {
                context.registerReceiver(connectionBroadcastReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
            }
    
            @JvmStatic
            fun registerToFragmentAndAutoUnregister(context: Context, fragment: Fragment, connectionBroadcastReceiver: ConnectionBroadcastReceiver) {
                val applicationContext = context.applicationContext
                registerWithoutAutoUnregister(applicationContext, connectionBroadcastReceiver)
                fragment.lifecycle.addObserver(object : LifecycleObserver {
                    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
                    fun onDestroy() {
                        applicationContext.unregisterReceiver(connectionBroadcastReceiver)
                    }
                })
            }
    
            @JvmStatic
            fun registerToActivityAndAutoUnregister(activity: AppCompatActivity, connectionBroadcastReceiver: ConnectionBroadcastReceiver) {
                registerWithoutAutoUnregister(activity, connectionBroadcastReceiver)
                activity.lifecycle.addObserver(object : LifecycleObserver {
                    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
                    fun onDestroy() {
                        activity.unregisterReceiver(connectionBroadcastReceiver)
                    }
                })
            }
    
            @JvmStatic
            fun hasInternetConnection(context: Context): Boolean {
                val info = (context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).activeNetworkInfo
                return !(info == null || !info.isConnectedOrConnecting)
            }
        }
    
        override fun onReceive(context: Context, intent: Intent) {
            val hasConnection = !intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)
    //        Log.d("AppLog", "conenctivity changed. hasConnection? $hasConnection")
            onConnectionChanged(hasConnection)
        }
    
        abstract fun onConnectionChanged(hasConnection: Boolean)
    }
    

    Usage in fragment:

        ConnectionBroadcastReceiver.registerToFragmentAndAutoUnregister(activity!!, this, object : ConnectionBroadcastReceiver() {
            override fun onConnectionChanged(hasConnection: Boolean) {
                // Log.d("AppLog", "onConnectionChanged:" + hasConnection)
            }
        })
    

提交回复
热议问题