Android横竖屏切换和灭屏亮屏时Activity的生命周期探究(1)
研究这个问题的初衷在于项目中碰到了一个问题:横屏的时候灭屏再亮屏,亮屏的时候用户能够清晰的看到先启动竖屏(过程1)再切换到横屏的过程,因为灭屏的时候onSaveInstanceState()保存的时横屏时的状态信息,因此过程1竖屏会使用到横屏的状态參数并且这一过程用户是可见的。因此会导致一些意想不到的Bug的出现。
探究使用的实例中我用了屏幕的横竖屏和宽这两个配置信息来说明生命周期中此时系统所知道的屏幕的客观状态,注意这个客观状态与我们在onSaveInstanceState()中要保存的“状态信息”是不一样的,客观状态由硬件和系统决定。在那一时刻一定是这种状态,“状态信息”是程序猿想要保存的信息,这个由程序猿自己控制。
横竖屏切换通常会由onConfigurationChanged()这个系统函数来响应,但响应这个函数须要在Manifest中为Activity配置例如以下信息(Android3.2及更高版本号的配置方法)
<activity
...
android:configChanges="orientation|screenSize"
... >
本篇先探究没有进行这种配置时Activity的生命状态,从结果中能够看到此时的横竖屏切换时一个全然杀死Activity再重新启动Activity的过程,同一时候横屏的灭屏亮屏都先做了一次切换到竖屏的过程。
源代码例如以下:
package com.vivo.configurationtest;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d("vi", "---onCreate()--" + "orientation = " + orientation()
+ "width = " + width());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
Log.d("vi", "---onSaveInstanceState()--" + "orientation = "
+ orientation() + "width = " + width());
super.onSaveInstanceState(outState);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
Log.d("vi", "---onStart()--" + "orientation = " + orientation()
+ "width = " + width());
super.onStart();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
Log.d("vi", "---onResume()--" + "orientation = " + orientation()
+ "width = " + width());
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
Log.d("vi", "---onPause()--" + "orientation = " + orientation()
+ "width = " + width());
super.onPause();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
Log.d("vi", "---onConfigurationChanged()--" + "width = " + width());
super.onConfigurationChanged(newConfig);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
Log.d("vi", "---onStop()--" + "orientation = " + orientation()
+ "width = " + width());
super.onStop();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
Log.d("vi", "---onRestart()--" + "orientation = " + orientation()
+ "width = " + width());
super.onRestart();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.d("vi", "---onDestroy()--" + "orientation = " + orientation()
+ "width = " + width());
super.onDestroy();
}
private String orientation() {
int ori = this.getResources().getConfiguration().orientation;
if (ori == Configuration.ORIENTATION_PORTRAIT) {
return "ORIENTATION_PORTRAIT--";
} else if (ori == Configuration.ORIENTATION_LANDSCAPE) {
return "ORIENTATION_LANDSCAPE--";
}
return "-------";
}
private int width() {
int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
return screenWidth;
}
}
//下面为没有在manifest中配置configuration
//竖屏从创建到切换到横屏
C:\Users\Administrator>adb logcat -s vi
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
D/vi (16610): ---onCreate()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onStart()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onResume()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onPause()--orientation = ORIENTATION_LANDSCAPE--width = 854 //onPause()时已经获取到切换之后的屏幕的配置信息
D/vi (16610): ---onSaveInstanceState()--orientation = ORIENTATION_LANDSCAPE--width = 854
D/vi (16610): ---onStop()--orientation = ORIENTATION_LANDSCAPE--width = 854
D/vi (16610): ---onDestroy()--orientation = ORIENTATION_LANDSCAPE--width = 854 //屏幕切换是一个全然的杀死activity然后重新启动activity的过程
D/vi (16610): ---onCreate()--orientation = ORIENTATION_LANDSCAPE--width =854
D/vi (16610): ---onStart()--orientation = ORIENTATION_LANDSCAPE--width = 854
D/vi (16610): ---onResume()--orientation = ORIENTATION_LANDSCAPE--width =854
//从横屏切换到竖屏
C:\Users\Administrator>adb logcat -s vi
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
D/vi (16610): ---onPause()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onSaveInstanceState()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onStop()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onDestroy()--orientation = ORIENTATION_PORTRAIT--width =480
D/vi (16610): ---onCreate()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onStart()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onResume()--orientation = ORIENTATION_PORTRAIT--width = 480
//竖屏从灭屏到亮屏
C:\Users\Administrator>adb logcat -s vi
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
D/vi (16610): ---onPause()--orientation = ORIENTATION_PORTRAIT--width = 480 //灭屏从onPause()处開始
D/vi (16610): ---onSaveInstanceState()--orientation = ORIENTATION_PORTRAIT--width = 480 //暂停并保存当前信息,要保存什么样的信息由用户选择
D/vi (16610): ---onStop()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onRestart()--orientation = ORIENTATION_PORTRAIT--width =480 //亮屏从onRestart()处開始
D/vi (16610): ---onStart()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onResume()--orientation = ORIENTATION_PORTRAIT--width = 480
//横屏的灭屏
C:\Users\Administrator>adb logcat -s vi
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
D/vi (16610): ---onPause()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onSaveInstanceState()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onStop()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onDestroy()--orientation = ORIENTATION_PORTRAIT--width =480
D/vi (16610): ---onCreate()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onStart()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onResume()--orientation = ORIENTATION_PORTRAIT--width = 480 //横屏的灭屏相当于先切换到竖屏,再灭屏。这个过程用户没看到
D/vi (16610): ---onPause()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onSaveInstanceState()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onStop()--orientation = ORIENTATION_PORTRAIT--width = 480
//横屏的亮屏
C:\Users\Administrator>adb logcat -s vi
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
D/vi (16610): ---onRestart()--orientation = ORIENTATION_PORTRAIT--width =480
D/vi (16610): ---onStart()--orientation = ORIENTATION_PORTRAIT--width = 480
D/vi (16610): ---onResume()--orientation = ORIENTATION_PORTRAIT--width = 480 //横屏的亮屏相当于先亮到竖屏,再切换到横屏。这个过程用户是能够看到的,灭屏的时候系统也做了一次相同的切换到竖屏的动作,屏灭用户没看到而已
D/vi (16610): ---onPause()--orientation = ORIENTATION_LANDSCAPE--width = 854
D/vi (16610): ---onSaveInstanceState()--orientation = ORIENTATION_LANDSCAPE--width = 854
D/vi (16610): ---onStop()--orientation = ORIENTATION_LANDSCAPE--width = 854
D/vi (16610): ---onDestroy()--orientation = ORIENTATION_LANDSCAPE--width = 854
D/vi (16610): ---onCreate()--orientation = ORIENTATION_LANDSCAPE--width =854
D/vi (16610): ---onStart()--orientation = ORIENTATION_LANDSCAPE--width = 854
D/vi (16610): ---onResume()--orientation = ORIENTATION_LANDSCAPE--width =854
Android横竖屏切换和灭屏亮屏时Activity的生命周期探究(1)的更多相关文章
- 横竖屏切换时,Activity的生命周期
横竖屏切换时,Activity的生命周期 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->onRe ...
- 安卓横竖屏切换时activity的生命周期
关于Activity横竖屏切换的声明周期变化: 1.新建一个Activity并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->on ...
- Andriod开发---《横竖屏切换时 Activity的生命周期的总结》
横屏切换竖屏Activity的生命周期详解,下面分析一下切换时具体的生命周期: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--&g ...
- Android(java)学习笔记224:横竖屏切换时Activity的生命周期
1.横竖屏切换的生命周期 默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...
- Android(java)学习笔记167:横竖屏切换时Activity的生命周期
1.横竖屏切换的生命周期 默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...
- 横竖屏切换时Activity的生命周期
设置横竖屏切换时Activity生命周期的属性设置,在清单文件中的Activity节点中设置.根据具体需求设置: 1.不设置Activity的android:configChanges时,切屏会重新调 ...
- 测试横竖屏切换时activity 的生命周期
对于这个面试题,相信大家都见过,网上给出的答案是: 1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2.设 ...
- 【Android开发学习笔记】【第五课】Activity的生命周期-上
今天学习Activity当中的七个生命周期函数: 首先得说一个事情,就是在代码当中如果加入了 System.out.println(" ------");之后,如何查看这里面的输出 ...
- 《android开发艺术探索》读书笔记(一)--Activity的生命周期和启动模式
No1: 如果新Activity采用了透明主题,那么当前Activity不会回调onStop: No2: 新Activity启动之前,栈顶的Activity需要先onPause后,新Activity才 ...
随机推荐
- mysql本地导入数据
1.获得一个超级权限的用户 grant all on *.* to root@'127.0.0.1' identified by 'root';# 因为我想在本地导入数据,而数据就在本地.# 有时候, ...
- tmux使用教程
1.安装 2.操作 如何操作快捷键呢? 比如新建一个窗口的命令是:ctrl+b+c 那么,先按住ctrl不放,接着按下b键,然后ctrl和b键都完全松开后,再立马按下c键. 3.使用命令行 tmux ...
- 读取复杂结构的yml配置项
1.yml配置项示例:(List的集合在第一项前面加 “-”) rabbitmqsetting: exchangeList: - name: e1 type: topic bindingList: - ...
- python基础--包、logging、hashlib、openpyxl、深浅拷贝
包:它是一系列模块文件的结合体,表现形式就是一个文件夹,该文件夹内部通常会有一个__init__.py文件,包的本质还是一个模块. 首次导入包:(在导入语句中中 . 号的左边肯定是一个包(文件夹)) ...
- 关系数据库标准语言 SQL (ch.3)
3.1 SQL 概述 3.1.2 特点 1 综合统一 非关系型语言 的数据语言都分为 DDL Scheme Data Definitin Language, 模式DDL SubScheme Data ...
- 关系数据库(ch.2)
2.1.1 关系 域 笛卡儿积 关系 candiate key 如果一组属性值可以唯一的标识一个元祖,但是他的子集不行,那么这是一个候选码 关系可以由三种类型 基本关系 查询关系 视图 为关系附加如下 ...
- 洛谷P1970 [NOIP2013提高组Day2T2] 花匠
P1970 花匠 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排 ...
- javaScript中的事件对象event是怎样
事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包含了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...
- mybatis中使用包装对象
在实际的应用中,很多时候我们需要的查询条件都是一个综合的查询条件,因此我们需要对已经存在的实体进行再一次的包装,以方便我们进行查询操作,于是包装对象的作用就很明显了,在这里我举一个简单的例子 1.首先 ...
- AspNet 常有功能函数1.0
1.net 获取客户端ip方法(此方法不是很准确) public static string GetIP() { string str; if (!string.IsNullOrEmpty(HttpC ...