registerNetworkCallback() was added in API level 21 (Android 5.0, Lollipop). It allows you to listen for changes in networks which satisfy a certain transport type (WiFi, cellular, Bluetooth, ...) and capability (SMS, NOT_METERED, ...).
registerDefaultNetworkCallback() was added in API level 24 (Android 7.0, Nougat) and uses your callback when any network change occurs, regardless of transport type and capability.
Example for registerNetworkCallback(). At least in my case I do not care about the filters and want my code to run for any network type. This can be achieved with an empty Builder object:
/* Automatically start a download once an internet connection is established */
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
// could filter using .addCapability(int) or .addTransportType(int) on Builder
val networkChangeFilter = NetworkRequest.Builder().build()
cm.registerNetworkCallback(networkChangeFilter,
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) = downloadStuff()
}
)
Above code is equivalent to this code with registerDefaultNetworkCallback():
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
cm.registerDefaultNetworkCallback(
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) = downloadStuff()
}
)
The confusingly named NetworkRequest is actually just a filter for transport type and capability.
The Default version is less code, but has a lower API level and thus supports fewer phones (74% vs 94%). Since I could not find a backwards-compatible version of this API call in ConnectivityManagerCompat I recommend using the first version if API levels 21-23 matter to you.