Android Connectivity

一、ConnectivityManager介绍

ConnectivityManager是Android中的一个系统服务类,用于管理网络连接状态。它提供了一些方法来检查设备的网络连接状态,并可以监听网络连接状态的变化。

以下是ConnectivityManager的一些常用方法和功能:

获取ConnectivityManager对象:

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

检查网络连接状态:

NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
    // 网络已连接
} else {
    // 网络未连接
}

监听网络连接状态变化:

ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        // 网络连接可用
    }


    @Override
    public void onLost(Network network) {
        // 网络连接丢失
    }
};


connectivityManager.registerDefaultNetworkCallback(networkCallback);

检查网络类型:

int networkType = networkInfo.getType();
if (networkType == ConnectivityManager.TYPE_WIFI) {
    // 当前网络为WiFi
} else if (networkType == ConnectivityManager.TYPE_MOBILE) {
    // 当前网络为移动数据网络
}

检查网络是否可用:

boolean isNetworkAvailable = connectivityManager.getActiveNetworkInfo() != null;

获取活动网络信息:

NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();

获取活动网络的详细信息:

NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());

这些是ConnectivityManager的一些常用方法和功能,可以帮助开发者在Android应用中管理和监控网络连接状态。

二、ConnectivityManager相关类

ConnectivityManager

ConnectivityManager为Android网络连接相关功能的对外类,ConnectivityManager为ConnectivityService的一层包装,实际功能实现在ConnectivityService中。

ConnectivityManager外部调用方式:

ConnectivityManager connMag = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  

ConnectivityManager文件路径:

packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java

ConnectivityManager定义:

public class ConnectivityManager {
    public interface OnNetworkActiveListener {
        void onNetworkActive(); 网络处于活动状态
    }
    public static class NetworkCallback {
        void onPreCheck(@NonNull Network network) {} 当框架连接到新网络以评估它是否满足此请求时。
        void onAvailable(@NonNull Network network) {} 当框架连接并声明新网络可供使用时调用。
        void onLosing(@NonNull Network network, int maxMsToLive) {} 在网络即将丢失时调用,通常是因为没有未完成的请求。
        void onLost(@NonNull Network network) {} 当网络断开连接或不再满足此请求或回调时调用。
        void onUnavailable() {} 如果在调用中指定的超时时间内未找到网络,或者无法满足请求的网络请求(无论是否指定了超时),则调用。
        void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities  networkCapabilities) {} 当与此请求对应的网络更改功能但仍满足请求的条件时调用。
        void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {} 当与此请求对应的网络更改时调用
        void onNetworkSuspended(@NonNull Network network) {} 当为此请求连接到的网络暂时暂停数据传输时调用。
        void onNetworkResumed(@NonNull Network network) {} 当为此请求连接到的网络从USPENDED状态返回时调用。
        void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {} 在阻止或取消阻止对指定网络的访问时调用。
        void onBlockedStatusChanged(@NonNull Network network, @BlockedReason int blocked) {} 在阻止或取消阻止对指定网络的访问时调用。
    }
    private class CallbackHandler extends Handler {
    public void handleMessage(Message message) {}
    }
}

NetworkRequest

定义通过 NetworkRequest.Builder发出的网络请求,用于通过ConnectivityManager#requestNetwork请求网络或通过ConnectivityManager#registerNetworkCallback侦听更改。

NetworkRequest文件路径:

packages/modules/Connectivity/framework/aidl-export/android/net/NetworkRequest.aidl

packages/modules/Connectivity/framework/src/android/net/NetworkRequest.java

NetworkRequest定义:

public class NetworkRequest implements Parcelable {
    public static class Builder {}
}

NetworkCapabilities

活动网络功能的表示形式。

NetworkCapabilities文件路径:

packages/modules/Connectivity/framework/aidl-export/android/net/NetworkCapabilities.aidl

packages/modules/Connectivity/framework/src/android/net/NetworkCapabilities.java

NetworkCapabilities定义:

public final class NetworkCapabilities implements Parcelable {
    public @interface NetCapability { 
        NET_CAPABILITY_MMS:指示这是一个能够访问运营商的 MMSC 以发送和接收彩信的网络。
        NET_CAPABILITY_SUPL:指示这是一个能够访问运营商的 SUPL 服务器的网络,用于检索 GPS 信息。
        NET_CAPABILITY_DUN:表示这是一个能够访问运营商的 DUN 或网络共享网关的网络。
        NET_CAPABILITY_FOTA:表示这是一个能够访问运营商FOTA门户的网络,用于无线更新。
        NET_CAPABILITY_IMS:指示这是一个能够访问运营商的 IMS 服务器的网络,用于网络注册和信令。
        NET_CAPABILITY_CBS:指示这是一个能够访问运营商的 CBS 服务器的网络,用于运营商特定的服务。
        NET_CAPABILITY_WIFI_P2P:指示这是一个能够到达 Wi-Fi 直接对等方的网络。
        NET_CAPABILITY_IA:指示这是一个能够访问运营商的初始连接服务器的网络。
        NET_CAPABILITY_RCS:指示这是一个能够访问运营商的 RCS 服务器(用于富通信服务)的网络。
        NET_CAPABILITY_XCAP:表示这是一个能够访问运营商的 XCAP 服务器(用于配置和控制)的网络。
        NET_CAPABILITY_EIMS:表示这是一个能够访问运营商的紧急 IMS 服务器或其他服务的网络,用于在紧急呼叫期间发出网络信令。
        NET_CAPABILITY_NOT_METERED:指示此网络不按流量计费。
        NET_CAPABILITY_INTERNET:指示此网络应该能够访问互联网。
        NET_CAPABILITY_NOT_RESTRICTED:指示此网络可用于常规用途。
        NET_CAPABILITY_TRUSTED:指示用户已指示对此网络的隐式信任。
        NET_CAPABILITY_NOT_VPN:指示此网络不是 VPN。
        NET_CAPABILITY_VALIDATED:指示已成功验证此网络上的连接。
        NET_CAPABILITY_CAPTIVE_PORTAL:指示上次探测此网络时发现此网络具有强制网络门户。
        NET_CAPABILITY_NOT_ROAMING:指示此网络未漫游。
        NET_CAPABILITY_FOREGROUND:指示此网络可供应用使用,而不是在后台保持以便于快速网络切换的网络。
        NET_CAPABILITY_NOT_CONGESTED:指示此网络未拥塞。
        NET_CAPABILITY_NOT_SUSPENDED:指示此网络当前未挂起。
        NET_CAPABILITY_OEM_PAID:指示通过此网络的流量由 OEM 支付。例如,系统应用可以使用此网络上传遥测数据。
        NET_CAPABILITY_MCX:指示这是一个能够访问运营商的关键任务服务器的网络。
        NET_CAPABILITY_PARTIAL_CONNECTIVITY:指示此网络经过测试,仅提供部分连接。
        NET_CAPABILITY_TEMPORARILY_NOT_METERED:指示此网络暂时不按流量计费。
        NET_CAPABILITY_OEM_PRIVATE:指示此网络是 OEM 专用的,仅供 OEM 使用。
        NET_CAPABILITY_VEHICLE_INTERNAL:表示这是一个内部车辆网络,用于与其他汽车系统通信。
        NET_CAPABILITY_NOT_VCN_MANAGED:指示此网络未包含在虚拟运营商网络 (VCN) 中。
        NET_CAPABILITY_ENTERPRISE:指示此网络供企业使用。
        NET_CAPABILITY_VSIM:表示此网络能够访问运营商的虚拟 Sim 服务。
        NET_CAPABILITY_BIP:指示此网络能够支持承载独立 Protol。
        NET_CAPABILITY_HEAD_UNIT:指示此网络已连接到汽车音响主机。
        NET_CAPABILITY_MMTEL:指示此网络能够支持 MMTEL(多媒体电话服务)。
        NET_CAPABILITY_PRIORITIZE_LATENCY:指示此网络应该能够确定互联网延迟的优先级。
        NET_CAPABILITY_PRIORITIZE_BANDWIDTH:指示此网络应能够确定互联网带宽的优先级。
    }
    public @interface Transport { 
        TRANSPORT_CELLULAR:指示此网络使用手机网络传输。
        TRANSPORT_WIFI:指示此网络使用 Wi-Fi 传输。
        TRANSPORT_BLUETOOTH:指示此网络使用蓝牙传输。
        TRANSPORT_ETHERNET:指示此网络使用以太网传输。
        TRANSPORT_VPN:指示此网络使用 VPN 传输。
        TRANSPORT_WIFI_AWARE:指示此网络使用 Wi-Fi 感知传输。
        TRANSPORT_LOWPAN:指示此网络使用 LoWPAN 传输。
        TRANSPORT_TEST:
        TRANSPORT_USB:指示此网络使用 USB 传输。
    }
}

Network

Network提供了一致将网络连接与应用程序进行关联的方式,使应用程序可以通过其特定要求选择使用的网络连接。Network类通常与ConnectivityManager类一起使用,用于管理网络连接以及执行网络操作。

Network文件路径:

packages/modules/Connectivity/framework/aidl-export/android/net/Network.aidl

packages/modules/Connectivity/framework/src/android/net/Network.java

Network定义:

public class Network implements Parcelable {
    private class NetworkBoundSocketFactory extends SocketFactory {
        public Socket createSocket(String host, int port, InetAddress localHost, int localPort)
        public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) 
        public Socket createSocket(InetAddress host, int port) 
        public Socket createSocket(String host, int port) 
        public Socket createSocket()
    }
}

LinkProperties

描述网络链接的属性,链接表示与网络的连接,它可能有多个地址和多个网关,多个DNS服务器,但只有一个http代理和一个网络接口。

LinkProperties 文件路径:

packages/modules/Connectivity/framework/aidl-export/android/net/LinkProperties .aidl

packages/modules/Connectivity/framework/src/android/net/LinkProperties .java

LinkProperties 定

public final class LinkProperties implements Parcelable {}

IConnectivityManager

IConnectivityManager是一个接口,ConnectivityService实现这个接口。

IConnectivityManager 文件路径:

packages/modules/Connectivity/framework/src/android/net/IConnectivityManager.aidl

IConnectivityManager 定义:

interface IConnectivityManager {}

ConnectivityService

提供网络连接管理服务,Connectivity的核心部分,对ConnectivityManager的实现,实现了IConnectivityManager接口。在SystemServer的init2中进行初始化,并增加到ServiceManager中。

ConnectivityService文件路径:

packages/modules/Connectivity/service/src/com/android/server/ConnectivityService.java

ConnectivityService定义:

public class ConnectivityService extends IConnectivityManager.Stub implements PendingIntent.OnFinished {}

三、相关API

ConnectivityManager API

Network getActiveNetwork() :返回与当前活动的默认数据网络相对应的Network对象。

NetworkCapabilities getNetworkCapabilities(@Nullable Network network):获取 NetworkCapabilities对于给定 Network 。

LinkProperties getLinkProperties(@Nullable Network network):获取LinkProperties对于给定Network 。 如果网络未知,这将返回null 。

void requestNetwork(@NonNull NetworkRequest request, int timeoutMs, int legacyType, @NonNull Handler handler, @NonNull NetworkCallback networkCallback) :请求特定的⽹络连接,并通过该连接发送数据。

void requestNetwork(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback):请求特定的⽹络连接,并通过该连接发送数据。

void requestNetwork(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback, @NonNull Handler handler):请求特定的⽹络连接,并通过该连接发送数据。

void requestNetwork(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback, int timeoutMs) :请求特定的⽹络连接,并通过该连接发送数据。

void requestNetwork(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback, @NonNull Handler handler, int timeoutMs):请求特定的⽹络连接,并通过该连接发送数据。

void releaseNetworkRequest(@NonNull PendingIntent operation) :Removes a request made via

void registerNetworkCallback(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback) :注册以接收有关满足给定要求的所有网络的通知

void registerNetworkCallback(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback, @NonNull Handler handler):注册以接收有关满足给定要求的所有网络的通知

void registerNetworkCallback(@NonNull NetworkRequest request, @NonNull PendingIntent operation) :注册以接收有关满足给定要求的所有网络的通知

void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback):注册以接收有关应用程序默认网络中更改的通知。

void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback, @NonNull Handler handler) :注册以接收有关应用程序默认网络中更改的通知。

void registerDefaultNetworkCallbackForUid(int uid, @NonNull NetworkCallback networkCallback, @NonNull Handler handler) :注册以接收有关指定 UID 的默认网络中更改的通知。

void registerSystemDefaultNetworkCallback(@NonNull NetworkCallback networkCallback, @NonNull Handler handler) :注册以接收有关系统默认网络中更改的通知。

void registerBestMatchingNetworkCallback(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback, @NonNull Handler handler) :注册以接收有关满足给定最佳匹配网络的通知

void unregisterNetworkCallback(@NonNull NetworkCallback networkCallback) :取消注册

void unregisterNetworkCallback(@NonNull PendingIntent operation):取消注册

void addDefaultNetworkActiveListener(final OnNetworkActiveListener l) :当系统的默认数据网络处于活动状态时开始侦听报告,这意味着这是执行网络流量的好时机。

void removeDefaultNetworkActiveListener(@NonNull OnNetworkActiveListener l) :删除先前用 addDefaultNetworkActiveListener(ConnectivityManager.OnNetworkActiveListener)注册的网络主动侦听

NetworkRequest API

NetworkRequest build():从现有实例创建新的网络请求生成器。

Builder addCapability(@NetworkCapabilities.NetCapability int capability):将给定的功能要求添加到此构建器。

Builder removeCapability(@NetworkCapabilities.NetCapability int capability) :从此构建器实例中删除(如果找到)给定功能。

Builder setCapabilities(NetworkCapabilities nc):为此构建器实例设置 {@code 网络功能},覆盖之前设置的任何功能。

Builder setUids(@Nullable Set<Range<Integer>> uids) :将此请求设置为仅匹配适用于指定 UID 的网络。

Builder addForbiddenCapability(@NetworkCapabilities.NetCapability int capability) :添加请求的网络中不得存在的功能。

Builder removeForbiddenCapability(@NetworkCapabilities.NetCapability int capability):从此构建器实例中删除(如果找到)给定的禁止功能。

Builder clearCapabilities() :从此构建器实例中完全清除所有,甚至删除构造对象时默认设置的功能。

Builder addTransportType(@NetworkCapabilities.Transport int transportType):将给定的传输要求添加到此生成器。

Builder removeTransportType(@NetworkCapabilities.Transport int transportType) :从此构建器实例中删除(如果找到)给定的传输。

Builder setNetworkSpecifier(NetworkSpecifier networkSpecifier) :设置可选的持有者特定网络说明符。

Builder setSignalStrength(int signalStrength):设置信号强度。

Builder setSubscriptionIds(@NonNull Set<Integer> subIds):设置可选的订阅 ID 集。

Builder setIncludeOtherUidNetworks(boolean include):指定生成的请求是否还应匹配不适用于调用 UID 的网络。

Network API

void bindSocket(DatagramSocket socket) :将指定的DatagramSocket绑定到这个Network 。

void bindSocket(Socket socket) :将指定的Socket绑定到这个Network 。

void bindSocket(FileDescriptor fd):将指定的FileDescriptor绑定到这个Network 。

SocketFactory getSocketFactory() :返回绑定到此网络的套接字工厂。

URLConnection openConnection(URL url) :在此 网络上打开指定的URL,以便在此网络上发送所有流量。URL 协议必须是HTTP或HTTPS。

URLConnection openConnection(URL url, java.net.Proxy proxy) :在此网络上打开指定的URL,以便在此网络上发送所有流量。URL 协议必须是HTTP或HTTPS。

ConnectivityService API

Network getActiveNetwork():取得活动的网络

NetworkCapabilities getNetworkCapabilities(Network network, String callingPackageName, @Nullable String callingAttributionTag):获取 连接状态 

LinkProperties getLinkProperties(Network network) :获取连接属性

NetworkRequest listenForNetwork(NetworkCapabilities networkCapabilities, Messenger messenger, IBinder binder,@NetworkCallback.Flag int callbackFlags, @NonNull String callingPackageName, @NonNull String callingAttributionTag):监听网络

NetworkRequest requestNetwork(int asUid, NetworkCapabilities networkCapabilities, int reqTypeInt, Messenger messenger, int timeoutMs, final IBinder binder, int legacyType, int callbackFlags, @NonNull String callingPackageName, @Nullable String callingAttributionTag) :请求网络

Network registerNetworkAgent(INetworkAgent na, NetworkInfo networkInfo, LinkProperties linkProperties, NetworkCapabilities networkCapabilities, @NonNull NetworkScore initialScore, NetworkAgentConfig networkAgentConfig, int providerId):向连接服务注册新代理以处理网络

int registerNetworkProvider(Messenger messenger, String name) :注册网络提供者

四、ConnectivityManager示例

requestNetwork

如下为调用ConnectivityManager的requestNetwork的示例代码:

void requestNetwork(){
    ConnectivityManager connectivityManager =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest networkRequest = new NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) //指示此网络是以太网类型
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)  //指示此网络应该能够访问互联网
        .build();
    ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(){

        @Override
        public void onAvailable(Network network){
            //当满足网络连接条件时调用,在此处可以执行需要网络连接的操作
        }


        @Override
        public void onLost(Network network){
            //当网络连接丢失时调用,在此处可以指定相应的断开网络连接的操作
        }
    };


    connectivityManager.requestNetwork(networkRequest, networkCallback);
}
  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值