最近在看Android开发,发现有一些坑是没有了解过Android开发是无法发现的,简单的记录一下。
用Android开发一个回答问题的APP,大概有5个问题,回答完毕后切换到下一题,或者手工跳到下一题。整个APP功能很简单,但是依然有很多的坑。
这个问题是一个很有意思的问题,在竖屏的时候查看第四题,但是在横屏之后,问题被重置为第一题了。
要了解这个问题,就必须了解Android中Activity的声明周期。Android中Activity有如下的生命周期:onCreate、onStart、onResume、onPause、onStop、onDestroy。
当启动一个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的屏幕翻转的过程中比较容易出现奇怪的问题,而且翻转的过程中容易出现一些小问题,而且这些问题往往很容易被忽视。
在测试过程中,最好针对每个页面进行分析,是否允许翻转,页面是否会存在中间变量,在翻转的过程中是否有保存。