Android高效进阶:从数据到AI【2.2】

4.2.5 Wi-Fi 连接

在 Wi-Fi 扫描成功后,单击对应的 Wi-Fi 项进行连接。在 Wi-Fi 连接成功后,会响应WifiManager.WIFI_STATE_CHANGED_ACTION 、 NETWORK_STATE_CHANGED_ACTION系统回调,在此回调监听中判断当前 Wi-Fi 的连接状态。连接某个 Wi-Fi 的原理是,通过 Wi-Fi列表的信息获取某个 Wi-Fi 的 ScanResult 对象并且获取 Wi-Fi 的 ssid 信息以及创建对应的

WifiConfiguration 信息。

创建 WifiConfiguration:

1. if(wifiConfiguration == null) {
2. wifiConfiguration = new WifiConfiguration();
3. wifiConfiguration.SSID = """ + this.mConnectSSID + """;
4. WifiApManager.setupConnectApWifiConfig(wifiConfiguration);
5. WifiApManager.setNetwork(wifiConfiguration, this);
6. //mNetworkId 不为-1,表示连接成功
7. mNetworkId = mWifiManager.addNetwork(wifiConfiguration);
8. wifiConfiguration.networkId = this.mNetworkId;
9. Logger.d(TAG, "created new network:" + wifiConfiguration.networkId);
10. } else {
11. mNetworkId = wifiConfiguration.networkId;
12. WifiApManager.setNetwork(wifiConfiguration, this);
13. }

根据不同的 Android 版本连接 Wi-Fi:
 

1. boolean enableNetwork() {
2. Method method;
3. if(Build.VERSION.SDK_INT != Build.VERSION_CODES.JELLY_BEAN
4. && Build.VERSION.SDK_INT != Build.VERSION_CODES.JELLY_BEAN_MR1) {
5. if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
6. return this.mWifiManager.enableNetwork(this.mNetworkId, true);
7. } else if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_
CREAM_SANDWICH_MR1) {
8. try {
9. method = WifiManager.class.getMethod("connectNetwork",
Integer.TYPE);
10. method.invoke(mWifiManager, Integer.valueOf(this.
mNetworkId));
11. return true;
12. } catch(Exception e) {
13. return this.mWifiManager.enableNetwork(this.mNetworkId,
true);
14. }
15. } else {
16. return this.mWifiManager.enableNetwork(this.mNetworkId, true);
17. }
18. }
19. try {
20. method = WifiManager.class.getMethod("connect", Integer.TYPE,
21. Class.forName("android.net.wifi.WifiManager$ActionListener"));
22. method.invoke(this.mWifiManager, Integer.valueOf(this.
mNetworkId), null); return true;
23. } catch(Exception e) {}
24. return this.mWifiManager.enableNetwork(this.mNetworkId, true);
25. }

在 Wi-Fi 连接成功后,会回调之前注册的系统监听 NETWORK_STATE_CHANGED_ ACTION,如果此时满足以下条件,表明已经连接成功:
 

1. NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.
EXTRA_NETWORK_INFO);
2. NetworkInfo.State state = networkInfo.getState();
3. NetworkInfo.State.CONNECTED == state //连接成功的标志
4.2.6 数据传输逻辑处理

数据传输主要是在 Wi-Fi 物理连接成功后,使得双方建立一个 Socket 通道来传输数据。下面以 Socket 连接流程时序图(见图 4-9)为例说明连接双方的交互逻辑。

在物理连接(指 Wi-Fi 连接)成功后,通过 TransferService 发送 ACTION_CONNECT 操作。在发送操作之前,会首先连接 ReceiveService 创建的 TCP 服务端,主要是通过 TransferProcessor#handleConnect 方法建立传输层连接的;其间发生的 I/O 操作、数据的读/写操作等都是通过 IOUtils 处理的;由于创建 ReceiveService 时会立马建立一个 ServerSocket 端口等待外部的 连 接 , 因此 在 收 到 TransferService 发 来 的 ACTION_CONNECT 操 作 后, 会 立 即 通过ReceivePorcessor 响应并告知 TransferService 通信双方已经建立好连接。此过程就代表一次双方的通信交互流程。

4.3 微信清理

微信算是国民应用,基本上每部手机都会安装,但随着使用时间变长,会发现微信占用的空间越来越大,加上微信官方并没有提供比较友好的清理工具,因此微信清理就应运而生了。它的核心功能是在实现清理微信过期消息和图文等信息的同时,不影响微信的正常使用,同时大大减少微信的内存占用量及相关损耗。

4.3.1 微信清理背景

在 Android 手机上使用微信时间长了,存储空间会变得越来越少,清理并腾出空间和为手机加速的用户需求就会越来越强烈,而且微信自带的清理功能不完善,因此就产生了对微信清理的需求。

4.3.2 微信清理设计

微信垃圾总体上可分为以下两类。

( 1)可放心清除的垃圾。

( 2)须谨慎清理的垃圾(清理后无法恢复或者需要重新连网下载)。

其中须谨慎清理的垃圾又可以分为以下小类别。

 聊天图片(缩略图、大图)。

 小视频(聊天视频、拍摄视频)。

 聊天表情。

 聊天文字和语音。

 拍摄及保存的图片(拍摄的图片、保存的图片)。

 下载的文件。

 其他缓存。

为了方便浏览,可按时间点排列这些垃圾,例如,一周内、一个月内、三个月内、三个月以上。

4.3.3 微信清理实现

微信清理的实现主要是通过反向分析各个目录的内容,然后做相应的处理,下面就是已归好类的目录说明。

( 1)主目录: tencent/MicroMsg(如表 4-2 所示)

4.4 Google 安装器

有时我们希望体验一下国外版本的优质 App,但发现它们默认都需要 Google 服务的支持,因此 Google 安装器就应运而生了,它解决的就是一些 App 默认需要 Google 服务支持的问题。

4.4.1 Google 安装器背景

目前市面上大部分国外游戏在运行时都依赖于 Google 服务框架,否则无法正常运行或者会发生闪退的情况。为了优化用户体验,我们需要为用户提供一个无缝安装 Google 服务框架并正常运行游戏与应用的服务。

然而由于 Android 系统本身碎片化非常严重,国内的 Android 环境又很复杂,各家硬件厂商都推出了自定义的 ROM,各种 Google 标准服务在这些 ROM 上的兼容性并不都好,因此实现一个兼容性好、服务稳定的框架不是一件容易的事情。

4.4.2 Google 服务框架

Google 服务框架的全称是 Google Mobile Service,简称 GMS,是 Android 系统中的灵魂所在,是 Android 系统最基本的通信服务。

在正常情况下,几乎所有的系统服务都需要依赖于它,但其并不直接影响通话、短信等基础功能,其作用仅是同 Google 产品之间保持联系,如联系人同步、日历同步安排、 Gmail 邮件收发以及 Google 游戏云服务(保存游戏进度、支持全平台)等,所以如果你不怎么使用Google 服务也可以选择不安装 GMS。此外 Google 在国内无法提供服务,一直是一个问题,而大部分 Google 推出的 App 在设备上运行时都会检测设备是否安装了 Google 服务框架,如果设备上没有这项服务,那么这些 App 就会发生要么无法安装要么闪退的情况。

只要你想使用 Google 提到的相关服务,比如应用下载、搜索、邮箱登录等相关操作,就不可能不跟 Google 发生关系。如果你是一个 Google 服务的老用户,可能感觉很不习惯,而且有些 App 还需要 Google Play 账户来运行。下面就来谈谈在遇到这些问题时需要加入的 Google服务框架。

因为 Android 系统自身碎片化以及版本不断更新和迭代,所以大部分的 Google 服务包并不能向上兼容,所以才会需要安装 Google 服务框架。在这个问题上, Google 服务框架的兼容性是一个关键问题。

1. Google 服务框架有什么用

Google 服务框架自带程序(如 Gmail、 Google 地图等)同一般的程序一样,如果你觉得不适合你的话,完全可以用其他软件替代,但是底层的 Google 服务框架是最关键的东西,它能够让你同步收发邮件、备份联系人、下载自己的日程安排等。另外,如果要在 Google 电子市场 Google Play 中购买应用程序或者杂志、音乐等,那么也需要安装 Google 服务框架,因为其中不仅涉及付款,还涉及验证机制,这也是为什么许多游戏在缺少 Google 服务框架的情况下会出现闪退、黑屏等状况的原因之一。除此之外,在 Google I/O 大会上公布的游戏进度存储和读取功能也需要使用 Google 服务框架。

由于 Android 系统前期的发展过于碎片化,因此在大概 Android 4.x 版本之后,许多 API接口都放在了 Google 服务框架中,这样对既想使用开源的 Android 系统又想摆脱 Google 服务的设备厂商产生了限制。同时,大多数的 GMS 升级都不依赖于 Android 系统版本的高低,因此核心功能的实现更加方便,碎片化也能得到一定的控制。

2. Google 服务框架的具体功能Google 服务框架的具体功能如下。

( 1)使用核心的 GApp(即 Google 推出的移动应用),如 YouTube、 Google Now、Google Play 商店、 Google Play 游戏、 Google 地图等。

( 2)基于 Google 账户的系统数据同步、备份,包括联系人、邮件、文件同步,游戏进度和多人线上联机等。

( 3) Google Play 商店的支付与验证等服务。

总的来说, Google 服务框架的作用就是同步、备份、联机、购买应用程序以及验证付费游戏。

3. Google 服务框架的组成

Google 服务框架主要由 4 个方面组成,分别介绍如下。

 GoogleServicesFramework: 用于整个 Android 系统的服务统一。

 GoogleLoginService:用于 Google 用户登录认证等服务。

 PrebuiltGmsCore: Google GMS 的核心组件。

 Phonesky: Google Play 应用商店。

4.安装 Google 服务框架

有多种方式可以获取 Google 服务框架,最常见的一种是通过 Recovery 刷入 GMS 服务,另一种则是通过用户自制的软件来安装匹配的 Google 服务框架。两种方式从本质上说是一样的。

第一种方式需要通过制作的卡刷包,通过第三方 Recovery 刷入,一般会分为完整版、精简版和迷你版 3 个版本。完整版包含了 GMS 服务以及所有的 GApp,精简版则包含 GMS 服务以及部分较为重要的 GApp(如 Google Play 商店、 YouTube 等),迷你版仅包含 GMS 服务,能够保证基本的 GMS 体验,其他 Google 系 App 则可以后续自行安装。通常而言,是通过下载 Google 服务包之后复制到手机存储卡,按照刷 ROM 的方法刷入的。关机进入 Recovery 模式的 choose zip form sdcard 并找到下载的服务包,然后确定即可。唯一要注意的是,选对Google 服务框架安装包,如果刷错了,可能导致不能开机,在这种情况下再次刷入对应版本的 Google 服务框架即可解决。

第二种方式则是通过玩家制作的 Google 安装器,软件会自动匹配符合机型的 GMS 服务,通常只有基本的 GMS 体验,可以直接安装 GMS。

最后要说明的是,官方原版的 Google Play 不支持直接安装使用,否则会出现闪退,在有Google 基础服务的情况下可以使用 RE 文件管理器复制 Google Play 到对应的系统文件夹。同理, GMS 中最核心的服务当属 Google Play 服务,但并不代表安装了 Google Play 服务就能够使用 GMS,事实上仅安装 Google Play 服务是完全没用的,它还需要与其他组件一起才能发挥作用。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容