Connecting Devices Wirelessly
- Using Network Service Discovery,局域网下的服务提供、发现框架
- 自己可以提供服务,然后通过NSD框架暴露在本地局域网(注册服务):
mNsdManager.registerService
; - 利用NSD框架,发现本地局域网的服务提供者:
mNsdManager.discoverServices
; - 解析发现的服务:
mNsdManager.resolveService
,解析成功的回调中,NsdServiceInfo
参数携带了服务提供者(server)的信息,供建立连接; - 根据解析的结果(协议,地址),自行建立连接,进行通信即可
- 当app退出,activity退出(onPause, onDestroy)时,需要将NSD服务取消注册
- 自己可以提供服务,然后通过NSD框架暴露在本地局域网(注册服务):
- 利用Wi-Fi建立P2P连接
- 声明权限:
ACCESS_WIFI_STATE
,CHANGE_WIFI_STATE
,INTERNET
- 监听系统广播事件:
- 定义一个BroadcastReceiver,对收到的WifiP2p广播(wifi p2p状态变化、peer列表变化、p2p连接变化、peer信息变化等)进行响应
- 在activity中注册BroadcastReceiver
- 发现设备:
mManager.discoverPeers
,mManager
为WifiP2pManager
对象,通过getSystemService
获得 - 在BroadcastReceiver收到peer列表变化广播后,获取peer列表:
mManager.requestPeers
- 建立p2p连接:
mManager.connect
- 建立连接成功后,BroadcastReceiver会收到连接状态变化的广播,此时可以获取peer的详细地址信息,供建立socket连接用:
mManager.requestConnectionInfo
- 声明权限:
- 使用Wi-Fi P2P进行服务发现
- NSD框架需要设备处于同一局域网下,而Wi-Fi P2P则无需设备接入网络
- 声明权限:
ACCESS_WIFI_STATE
,CHANGE_WIFI_STATE
,INTERNET
- 注册自己提供的服务:
WifiP2pDnsSdServiceInfo.newInstance
,mManager.addLocalService
- 发现附近的服务提供者
WifiP2pManager.DnsSdTxtRecordListener
WifiP2pManager.DnsSdServiceResponseListener
mManager.setDnsSdResponseListeners(channel, dnsSdServiceResponseListener, dnsSdTxtRecordListener)
mManager.addServiceRequest
mManager.discoverServices
Performing Network Operations
- 进行网络通信
- 大部分都采用HTTP协议,选择HTTP client很重要,OkHttp已被安卓6.0作为系统默认HTTP client
- 进行网络连接之前,需呀检查一下网络是否可用(仅仅是检查是否接入网络,并不能检测是否可以访问互联网):
ConnectivityManager.getNetworkInfo(type)
,ConnectivityManager.getActiveNetworkInfo()
和NetworkInfo.isConnected()
- 也可以把网络访问出错的处理集中起来,总之,要么所有网络访问之前都进行网络检查,要么网络访问出错之后集中处理,这样代码更简洁优雅
- 网络访问不能在UI线程上执行,使用RxAndroid可以方便的进行异步操作
- 管理网络使用
- 通常,为用户提供以下设置选项,比较好:同步频率,是否仅在wifi下联网等
- 监听网络状态变化:使用一个监听
ConnectivityManager.CONNECTIVITY_ACTION
广播的BroadcastReceiver
,接收网络状态变化事件 - 在代码中注册/反注册
BroadcastReceiver
,可以控制其活跃期 - 如果在manifest中声明,则其活跃期将是系统启动到系统关闭,此时可以通过
PackageManager.setComponentEnabledSetting(...)
方法启用/禁用组件
- 解析XML
- 安卓系统内置有xml解析器:
XmlPullParser
- 安卓系统内置有xml解析器:
Transferring Data Without Draining the Battery
-
典型手机蜂窝网络状态机
- APP的网络请求应该考虑蜂窝网络的特性:积攒多个请求,集中发送;适当预取;积攒多次请求的数据,但是使用同一次请求批量发送;
- 使用DDMS/AndroidStudio的网络监控工具,可以查看APP网络请求的特征,并进行适当优化
- 进行数据备份、数据同步时,可以把网络请求交给GSM,它会将任务延迟至充电时、连接wifi时、或者是进行上述打包操作
- 适当缓存,以减小网络数据的传输
- 调整网络请求的模式,wifi、高带宽时,集中请求大量数据,减少网络请求的频率和次数
- 更多关于电量优化的内容,还需要在有实际开发需求的时候,进行实践和深入
Backing up App Data to the Cloud
- 安卓系统提供了自动同步的功能,不过是同步到google drive,每个app拥有25MB的空间
- 同步有较好的开始策略(充电,连接wifi,处于空闲状态,或者24小时未同步),但是当25MB空间用完之后,没有备份替换策略,仅仅是停止备份
- API 23起,系统默认备份APP的所有数据,可以在manifest中进行添加或排除,通过
android:fullBackupContent
指定配置文件 - API 23之前的版本,系统提供了
BackupAgent
接口,同样也是备份到google服务器 - google还提供了Cloud Save service,用于保存数据(不是备份应用数据),同一用户在不同设备保存数据时,会有冲突,Cloud Save service也提供了相应的冲突处理接口