Android测试的坑——屏幕翻转

背景

最近在看Android开发,发现有一些坑是没有了解过Android开发是无法发现的,简单的记录一下。

场景

用Android开发一个回答问题的APP,大概有5个问题,回答完毕后切换到下一题,或者手工跳到下一题。整个APP功能很简单,但是依然有很多的坑。

翻转屏幕后问题被重置为第一题

这个问题是一个很有意思的问题,在竖屏的时候查看第四题,但是在横屏之后,问题被重置为第一题了。

要了解这个问题,就必须了解Android中Activity的声明周期。Android中Activity有如下的生命周期:onCreate、onStart、onResume、onPause、onStop、onDestroy。

  • 理解Android的生命周期的变化

当启动一个Activity的时候,会激活onCreate、onStart和onResume。最终用户看到的状态是onResume,这个状态能够获得用户的焦点,并且能让用户与系统进行交互。把日志打出来如下:

12-13 17:15:22.714 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onCreate(Bundle) called
12-13 17:15:22.754 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onStart() called
12-13 17:15:22.754 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onResume() called

这个时候,把屏幕翻转,日志信息如下:

12-13 17:16:37.354 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: nCreate(Bundle) called
12-13 17:16:37.404 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onStart() called
12-13 17:16:37.404 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onResume() called
12-13 17:16:39.494 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onPause() called
12-13 17:16:39.494 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onStop() called
12-13 17:16:39.494 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onDestroy() called
12-13 17:16:39.514 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: nCreate(Bundle) called
12-13 17:16:39.514 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onStart() called
12-13 17:16:38.514 22987-22987/com.example.svenweng.geoquiz D/QuizActivity: onResume() called

从日志我们就可以清楚的看到在执行翻转的时候,系统对原来的Activity进行了销毁的处理,也就是执行了onPause、onStop和onDestroy。之后又执行了onCreate、onStart和onResume。重新创建了一个Activity。

  • 分析问题

从代码上来看,我们控制题目是通过一个题号来处理的,也就是说在onCreate的时候,初始化题号的变量为0,所以在竖屏的时候查看题目的变化是正常的,而一旦翻转屏幕后,就会重新执行onCreate方法,也就是说题号的变量被初始化为0,所以在横屏后,我们就会发现看到的题目又变为第一题了。

  • 修复问题

在屏幕变化的时候,把这个题号的变量做一下存储,就可以解决这个问题

  • 衍生拓展

Activity涉及到横屏竖屏变化的时候,如果存在记录某些数据的中间变量,需要做存储操作,在测试这块内容的过程中,需要针对这个问题进行专门的设计。

翻转屏幕后布局显示的不正确

正常我们看到的界面,是用代码在xml布局文件中写的。一般来说,这个布局是针对竖屏状态的。如果页面翻转后变为横屏,这时Android系统会根据竖屏的布局文件来自动做横屏适配,这种适配有时候会出现控件分布与预期不一致。

  • 分析问题

对于Android系统的自动适配,我们无法控制,这个问题涉及到Android系统的底层。

我们可以根据页面来做分析,可以让开发专门针对横屏的特点进行编写横屏的布局文件,让横屏之后页面的布局由横屏布局文件来控制,以便达到我们想要的效果

另一种方式可以根据需求判定,是否禁止用户进行横屏操作。

  • 衍生拓展

Android的分辨率千变万化,在平板电脑上运行APP也可能导致布局看起来不舒服的情况,也可以评估需求针对这些做专门的布局处理

总结

在Android的屏幕翻转的过程中比较容易出现奇怪的问题,而且翻转的过程中容易出现一些小问题,而且这些问题往往很容易被忽视。

在测试过程中,最好针对每个页面进行分析,是否允许翻转,页面是否会存在中间变量,在翻转的过程中是否有保存。

时间: 12-01

Android测试的坑——屏幕翻转的相关文章

Android WebView的坑总结

最近把做好的iPad HybridApp向Android迁移,碰到的坑太多了,让我这个折腾过Android接近4年的老鸟都头疼!现在把前人遇到的都列出来,再慢慢解决自己的,目前已经解决了android键盘覆盖问题,下面最棘手的问题就是屏幕高度的适配问题了!本文会不断更新 1. Andrid4.1事件穿透BUG 原因不明 2. Android2.X 中文不支持粗体 3. 目前发现的WEBVIEW尺寸宽度有320. 360. 400等多个尺寸 该分辨率或许和屏幕尺寸有关 目前测试结果 320-640

Android -- 距离感应器控制屏幕灭屏白屏

权限                                                                                             <uses-permission android:name="android.permission.DEVICE_POWER"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>

android 应用程序自适应屏幕大小(转载)

android应用自适应多分辨率的解决方法 1. 首先是建立多个layout文件夹(drawable也一样).在res目录下建立多个layout文件夹,文件夹名称为layout-800x480等.需要适应那种分辨率就写成什么.注意:         a.   较大的数字要写在前面:比如layout-854x480而不能写layout-480x854.         b.   两个数字之前是小写字母x,而不是乘号.2. 在不能的layout下调整layout 的长宽等各种设置.以适应不同的分辨率

android 应用程序自适应屏幕大小

android应用自适应多分辨率的解决方法 1. 首先是建立多个layout文件夹(drawable也一样). 在res目录下建立多个layout文件夹,文件夹名称为layout-800x480等.需要适应那种分辨率就写成什么. 注意: a.   较大的数字要写在前面:比如layout-854x480而不能写layout-480x854. b.   两个数字之前是小写字母x,而不是乘号. 2. 在不能的layout下调整layout 的长宽等各种设置.以适应不同的分辨率. 3 最后需要在Andr

Unity 发布到IOS,Android的各种坑

Unity 发布到IOS的注意事项1.开发环境MAC环境:Xcode环境 7.2.1Unity环境:Unity5.32.基本说明首先,我说一下,这是我在对Unity发布到IOS的实际使用中,总结出来的经验!如果你想一次就发布成功,如果你想少走弯路,请仔细看我的说明.因为坑比较多!由于Unity发布到IOS,是以Xcode工程的形式发布到MAC中,所以,在发布的时候需要注意以下几点:1. 发布的工程,需要以真机进行调试(我发布的时候,选择发布unity到模拟器版本,发布后无法用模拟器运行)2. U

【Android测试】【随笔】模拟长按电源键

起因 昨天群里看到有人问如何实现一个长按电源键的操作,这个问题经常遇到,而且对于新手来说也比较棘手,于是在尝试成功后,决定说说这个事情. 一般这样的需求都出现在自动化操作的过程中.但是一般的ui自动化貌似对长按操作都支持的不是特别好,即使有也是针对手机屏幕中的区域来进行长按,我们都知道电源键是一个实体键,无法通过点击ui来实现.说道这里估计很多人都想到了KEYCODE(“KEYCODE” 在[Android测试][第十二节]Uiautomator——API详解 中的Uidevice的API列举中

Android测试基础

android测试框架(Android Testing Framework)是开发环境的一部分,它提供了架构和强大的工具帮助你从单元到框架测试应用的各个方面. 关键特性: 基 于 JUnit,可直接使用JUnit测试一些与Android AP不相关的类,或使用 Android的JUint 扩展来测试 Android 组件.如果你刚开始接触 Android 测试,可以先从 AndroidTestCase开始写一些通用目的的测试用例,然后再写较复杂的测试用例. Android JUint扩展提供了对

Android测试APP工具(一)

最近面试APP开发人员的时候,遇到了技术总监问 APP测试的概念性问题,后面感觉基本的项目流程.项目逻辑.屏幕适配. 测试是完全没有问题的,但是对于APP的性能测试.压力测试等高端的测试,还是存在着美中不足之处呀,毕竟是搞专业的APP开发 人员.但是,自己追求APP开发的流程是永不止境的,所以下定决心去了解深挖一下APP的测试,饿补一下APP的高端测试流程及其常 用工具.最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框 架.C

ym——Android如何支持多种屏幕

原文链接:http://developer.android.com/guide/practices/screens_support.html 支持多屏 Android涉及各种各样的支持不同屏幕尺寸和密度的设备.对于应用程序,Android系统通过设备和句柄提供了统一的开发环境,大部分工作是校正每一个应用程序的用户界面到它显示的屏上.与此同时,系统提供APIs允许你控制应用界面为特定的屏幕尺寸和密度,为不同屏幕的配置提供最优化的用户界面设计.例如,你可能会要一个平板电脑的用户界面,这不同于手机的用