测试手机:Nexus 5   系统:4.4

一、测试

测试代码:

 1 package com.example.androidalarm;
 2
 3 import android.app.Activity;
 4 import android.content.Context;
 5 import android.content.res.Configuration;
 6 import android.os.Bundle;
 7 import android.util.AttributeSet;
 8 import android.util.Log;
 9 import android.view.View;
10 import android.widget.Button;
11
12 public class MainActivity extends Activity {
13     Button addButton, cancelButton;
14
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.activity_main);
19         Log.d("BigFootprint", "onCreate");
20     }
21
22     @Override
23     public void onConfigurationChanged(Configuration newConfig) {
24         Log.d("BigFootprint", "onConfigurationChanged");
25         super.onConfigurationChanged(newConfig);
26     }
27
28     @Override
29     public View onCreateView(String name, Context context, AttributeSet attrs) {
30         Log.d("BigFootprint", "onCreateView");
31         return super.onCreateView(name, context, attrs);
32     }
33
34     @Override
35     protected void onDestroy() {
36         Log.d("BigFootprint", "onDestroy");
37         super.onDestroy();
38     }
39
40     @Override
41     protected void onPause() {
42         Log.d("BigFootprint", "onPause");
43         super.onPause();
44     }
45
46     @Override
47     protected void onRestart() {
48         Log.d("BigFootprint", "onRestart");
49         super.onRestart();
50     }
51
52     @Override
53     protected void onRestoreInstanceState(Bundle savedInstanceState) {
54         Log.d("BigFootprint", "onRestoreInstanceState");
55         super.onRestoreInstanceState(savedInstanceState);
56     }
57
58     @Override
59     protected void onResume() {
60         Log.d("BigFootprint", "onResume");
61         super.onResume();
62     }
63
64     @Override
65     protected void onSaveInstanceState(Bundle outState) {
66         Log.d("BigFootprint", "onSaveInstanceState");
67         super.onSaveInstanceState(outState);
68     }
69
70     @Override
71     protected void onStart() {
72         Log.d("BigFootprint", "onStart");
73         super.onStart();
74     }
75
76     @Override
77     protected void onStop() {
78         Log.d("BigFootprint", "onStop");
79         super.onStop();
80     }
81 }

View Code

XML配置:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.androidalarm"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="18" />
10
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             android:name="com.example.androidalarm.MainActivity"
18             android:label="@string/app_name" >
19             <intent-filter>
20                 <action android:name="android.intent.action.MAIN" />
21                 <category android:name="android.intent.category.LAUNCHER" />
22             </intent-filter>
23         </activity>
24     </application>
25 </manifest>

View Code

以以上的代码运行,打开应用,LOG输出如下“

可以看到,打开Activity的时候,生命周期是符合文档描述的,但是onCreateView接口会被多次调用,所以最好不要在这边实例化数据。按下BACK键退出,LOG如下:

生命周期非常正常。当Activity显示的时候,屏幕暗掉,LOG如下:

红框中为多打印的3个生命周期过程,可以看到onSaveInstanceState的调用时机!亮起屏幕,LOG如下:

生命周期一如文档所说。如果按下Home键退出,则LOG如下:

可以看到,和屏幕暗掉的LOG完全一样。重新点击应用图标打开Activity,得到如下LOG:

这个时候并没有去OnCreate,而是调用了方法onRestart方法。

这时候切换屏幕(竖屏切为横屏):(备注:因为onCreateView调用次数太多,而且不是重点研究对象,后面去掉此处LOG)

可以看到切换的时候,生命周期又走了一遍,并且调用了onSaveInstanceState和onRestoreInstanceState方法用于保存和恢复状态。然后从横屏恢复为竖屏,LOG如下:

调用的生命周期过程完全和上面的切换完全一样。

接下来要试验的是,重新在XML文件中配置Activity。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.androidalarm"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="18" />
10
11     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
12
13     <application
14         android:allowBackup="true"
15         android:icon="@drawable/ic_launcher"
16         android:label="@string/app_name"
17         android:theme="@style/AppTheme" >
18         <activity
19             android:name="com.example.androidalarm.MainActivity"
20             android:configChanges="orientation"
21             android:label="@string/app_name" >
22             <intent-filter>
23                 <action android:name="android.intent.action.MAIN" />
24                 <category android:name="android.intent.category.LAUNCHER" />
25             </intent-filter>
26         </activity>
27     </application>
28 </manifest>

View Code

多加了一个配置: android:configChanges="orientation"。并且需要添加permission。

这是竖屏——>横屏——>竖屏切换过程中打印的LOG,可以看到,和没有配置的时候完全一样。再配置如下:添加: android:configChanges="orientation|keyboardHidden"

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.androidalarm"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="18" />
10
11     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
12
13     <application
14         android:allowBackup="true"
15         android:icon="@drawable/ic_launcher"
16         android:label="@string/app_name"
17         android:theme="@style/AppTheme" >
18         <activity
19             android:name="com.example.androidalarm.MainActivity"
20             android:configChanges="orientation|keyboardHidden"
21             android:label="@string/app_name" >
22             <intent-filter>
23                 <action android:name="android.intent.action.MAIN" />
24                 <category android:name="android.intent.category.LAUNCHER" />
25             </intent-filter>
26         </activity>
27     </application>
28 </manifest>

View Code

打印的LOG还是一样,接下来再配置:改成android:configChanges="orientation|screenSize", 切换横竖屏打印的LOG如下:

注意,这里也是竖屏——>横屏——>竖屏切换,每次切换只打印一行LOG。

二、结论

  在网上看到很多的资料讲述生命周期,结论应该只有一个:生命周期会因为系统版本甚至因为定制等各种因素而各有差异。所以本文一开始就给出了测试环境。上面的测试只在一种环境下完成,不能代表所有系统和所有机型。读者如需了解问题,还应该在当前环境下自己去进行测试。但是由此依然可以得出一些结论:

1)onCreateView接口会被多次调用,在这个接口中的代码要好好考虑,实例化数据,加载资源的动作最好不要放在这个方法中;

2)如果不是程序主动关闭Activity(比如按下回退键),onPause()之后会调用onSaveInstanceState方法保存状态,此后恢复Activity,如果在这之间调用了onDestory,即Activity被意外销毁,会在onStart()和onResume()之间调用onRestoreInstanceState方法恢复状态,否则,会以onRestart->onStart()->onResume()的顺序重新打开Activity;

3)如果不配置Activity的configChanges或者配置没有起效果(注:如何起效果,视环境而定,最保险的方案目前是:android:configChanges="orientation|screenSize|keyboardHidden"),则在横竖屏切换的时候,会重新走一遍生命周期,否则,只会调用onConfigurationChanged方法;

补充一下关于configChanges的参数值解释:

Value Description
“mcc“ The IMSI mobile country code (MCC) has changed — that is, a SIM hasbeen detected and updated the MCC.移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ The IMSI mobile network code (MNC) has changed — that is, a SIM hasbeen detected and updated the MNC.移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ The locale has changed — for example, the user has selected a new language that text should be displayed in.用户所在地区发生变化。
“touchscreen“ The touchscreen has changed. (This should never normally happen.)
“keyboard“ The keyboard type has changed — for example, the user has plugged in an external keyboard.键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ The keyboard accessibility has changed — for example, the user has slid the keyboard out to expose it.用户打开手机硬件键盘
“navigation“ The navigation type has changed. (This should never normally happen.)
“orientation“ The screen orientation has changed — that is, the user has rotated the device.设备旋转,横向显示和竖向显示模式切换。
“fontScale“ The font scaling factor has changed — that is, the user has selected a new global font size.全局字体大小缩放发生改变

根据这份解释,个人感觉其实系统是有BUG的,理论上configChanges=orientation这样的配置在设备旋转后就应该会去调用onConfigurationChanged方法,但实际上连亲生儿子也不遵循。

最后根据这次试验,总结一下Activity认为意外关闭的三种场景:

1)屏幕暗下去;

2)按下HOME键退出Activity;

3)横竖屏切换;

这三种情景都会导致Activity调用onSaveInstanceState去保存自己的状态以便于恢复。

转载于:https://www.cnblogs.com/lqminn/p/3856089.html

【Android】Activity生命周期(亲测)相关推荐

  1. Android Activity 生命周期详解及监听

    前言 系列文章: Android Activity 与View 的互动思考 Android Activity 生命周期详解及监听 Android onSaveInstanceState/onResto ...

  2. Android activity 生命周期(一)

    Android activity 生命周期(一) 转载请注明出处:http://blog.csdn.net/chenlinfeng772885775/article/details/53672919 ...

  3. Android activity生命周期

    这篇博客主要包含以下知识点: activity介绍. activity生命周期的详细过程(不同情况下的变化以及状态的改变).finish和onDestory方法的关系.onSaveInstanceSt ...

  4. Android Activity生命周期举例说明(图文)

    同学电话面试提及到Activity生命周期的详细说明,现整理如下: 转载请标明姓名及出处:大飞_Rflyee - http://blog.csdn.net/rflyee/article/details ...

  5. android activity生命周期_Android岗高频面试题合一集,看你能答出几题?

    前言 面试季黄金时期来袭,想必许多朋友在这时有找工作.换工作.跳槽涨薪等想法,但你们都有一个相同的过程那就是面试.大家肯定想知道面试时都问哪些面试相关问题,所以就去网上查找题去刷题,为了省去大家找题的 ...

  6. android 生命周期管理,Android Activity生命周期和堆栈管理的详解_Android_脚本之家...

    Activity的生命周期 Activity是Android中的四大组件之一,也是最基本,最重要的组件,是android系统提供一个可视化的,能与用户交换的组件. 系统提供的组件,不需要用户实例化,用 ...

  7. Android Activity 生命周期和重要的相关函数(基础一)

    总结: 1.oncreate 2.onstart            可见但不交互 3.onrestart         从其他界面重新调转过来 4.onresume       可交互 5.on ...

  8. xamarin Android activity生命周期详解

    学Xamarin我为什么要写这样一篇关于Android 的activity生命周期的文章 已经学Xamarin android有一段时间了,现在想起当初Xamarin也走了不少的弯路.当然Xamari ...

  9. Android Activity生命周期管理

    http://blog.csdn.net/thl789/article/details/6628463 本文描述Android中Activity的状态,Activity的状态转换,从而总结了Activ ...

  10. 04 Android Activity生命周期

    文章目录 1 Activity 生命周期 1.1 生命周期 1.2 Android 开发的规则 2 设备配置变化,Activity被销毁 3 进出停止态 3.2 进出停止态的过程 4 进出暂停态 4. ...

最新文章

  1. 三框架:使用数据源dbcp注意
  2. VMware虚拟机安装Centos7
  3. 打造最好用的离线QQ截图工具 C#
  4. AA065VD时序的确定
  5. yelee主题有时候出现背景完全空白的问题
  6. C++ vector.insert的用法
  7. C语言程序设计第三节课作业
  8. 配置gitlab环境实现代码管理及Web Hook测试和ldap认证
  9. 【Python笔记】元组的用法
  10. 智慧城市助力城市管理 推动新兴产业升级
  11. php检测是否存在敏感词,如何用PHP+Ajax判断是否有敏感词汇
  12. 橘子游戏平台_腾讯游戏主播认证名单公布,唯独张大仙缺席
  13. 官网下载STM32系列芯片的产品选型手册
  14. 修改Tomcat8的默认访问端口8080
  15. Y2K Accounting Bug POJ - 2586
  16. Mac 清理缓存命令
  17. 电器元件——LM7805
  18. [转] 海尔集团CEO张瑞敏演讲《人不成熟的几大特征》
  19. 浙江卫视的万峰纯粹一烂人
  20. 2022-2028年全球与中国SCADA石油和天然气行业发展趋势及投资战略分析

热门文章

  1. 如何构建顶部导航条_如何构建导航栏
  2. 适合初学者的数据结构_数据结构101:数组-初学者的直观介绍
  3. oye pandora_我尝试了Pandora出色的功能优先级排序方法。 这是我学到的。
  4. 余数定理_如何用Java实现余数定理
  5. react前端开发_是的,React正在接管前端开发。 问题是为什么。
  6. ESXi6.5环境搭建(二:ESXi 6.5环境的安装及配置)
  7. matlab实验是啥,matlab实验心得体会
  8. PHP 获取数组最后一个值
  9. 如何用xmanager远程连接centos6.0的桌面
  10. Java开发工具(Eclipse中内容辅助键的使用)