Android Activity生命周期的几个问题
每一个Android开发者都应该知道,android系统有四个重要的基本组件,即Activity(活动)、Service(服务)、Broadcast Receive(广播接收器)和Content Provider(内容提供器),其中,Activity是最重要的组件,打开你手机上的APP,你眼睛所能看到的都是Activity,下面将会介绍关于Activity生命周期的几个问题。
1 Activity生命周期的8个回调函数
下图是Activity的生命周期图,相信许多人都看过不止一次,但有的人是看到这张图时明白,过一段时间就记不清或者忘了,怎么才能完全理解并掌握呢?
其实很简单,只要记住下面两点就行:
(1) Activity的6个回调函数onCreate()– onStart() – onResume() – onPause() – onStop() – onDestroy()可以分成三组,里边的onResume()和onPause()表示Activity是否在前台获得焦点,onStart()和onStop()表示Activity是否可见,最外边的onCreate()和onDestroy()表示Activity是否存在。OnRestart()函数在Activity第一次启动时并不会被调用,当Activity从onStop()不可见状态重新回到可见状态时会先调用onRestart(),再调用onStart(),除了这7个回调函数外,还有一个函数很重要,就是onSaveInstanceState(), 常常用它来保存Actitity的一些状态变量。
(2) Activity正常启动后,都会停在onResume()函数之后,想象一下,你打开Android手机的APP,正在看某个Activity上面显示的内容,如果这个Activity打印出了调试信息并且你能够看到,那么大概信息就会如下图所示
你看Activity上面的内容时,Activity就会停在onResume函数之后。
2 Activity几个重要回调函数的说明
上面提到的Activity的8个回调函数,究竟哪些最重要呢?
onCreate()肯定是最重要的,IDE都会默认生成onCreate()函数,它会在Activity第一次被创建时调用,在onCreate()函数中会加载布局,初始化视图,绑定事件和其他的各种初始化操作,一个Activity的其他几个回调函数都有可能不被调用,但onCreate()一定会被调用,因为onCreate()里面往往内容很多,所以不要把所有代码都写到一起,这样不便于维护,而应该分成各种子函数,类似下面的方式:
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
f1();
f2();
f3();
...
}
onPause()是离开Activity时调用的第一个方法,你在onPause()里应该保存一些重要数据,释放系统资源,因为只有onPause()_执行完后,下一个Activity才能正常运行,所以onPause()不能执行耗时操作。
onSaveInstanceState()常常被用作保存Activity临时的状态信息,在系统配置信息发生变化或者内存低导致重建Activity时,这个函数非常有用。比如我们在EditText输入的信息,在屏幕发生旋转时,信息就会丢失,这种情况,我们可以在onSaveInstanceState()保存用户输入的数据,然后在onCreate()或onRestoreInstanceState()进行恢复,后者更加方便一些,因为不需要进行Null值判断。
3 其他小问题
(1) 关于super.onCreate(savedInstanceState)
你会发现,每一个回调函数都会首先调用父类的回调函数,super.onX(),这个是必须的,如果不调用父类的回调函数,运行时应用会崩溃。
(2) 为什么没有看到Activity的构造函数
其实,你可以写Activity的构造函数,无参数的构造函数确实会在onCreate()之前执行,但构造函数实际上作用不大,系统会在Activity构造函数执行后创建上下文环境,然后再调用onCreate()函数,所有的初始化操作都应该放在onCreate()中。
(3) 什么时候只会调用onPause()而不会调用onStop()
onPause()表示Activity失去焦点,onStop()表示不可见,所以必须是Activity失去焦点但部分可见才能只调用onPause而不调用onStop(), 但并不是所有的失去焦点并部分可见就会调用onPause(), 如当前Activity产生的对话框,系统的关机对话框,音量对话框,都使当前Activity失去焦点,但都不会调用onPause()函数。
怎样才能调用onPause()而不调用onStop呢?可以新建两个Activity,用Activity1启动Activtiy2,把Activity2的主题设为
android:theme="@style/Theme.AppCompat.Dialog"
你就发现Activity1只会调用onPause()而不会调用onStop。
当你在Activity打开某个网址是,系统会弹出对话框,会有几个应用让你选泽,如UC浏览器或QQ浏览器等,此时,就只会调用onPause(),还没有调用onStop()。具体方法大家可以自己实验测试。
以上是Activity生命周期的几个问题,其他关于Activity的内容后面可以再讨论。
转载请注明出处 http://www.cnblogs.com/thewalker3000/p/6528768.html
欢迎大家评论
Android Activity生命周期的几个问题的更多相关文章
- [转]: 两分钟彻底让你明白Android Activity生命周期(图文)!
转自:http://blog.csdn.net/android_tutor/article/details/5772285 大家好,今天给大家详解一下Android中Activity的生命周期,我在前 ...
- Android Activity生命周期
从android api文档摘抄出来的activity生命周期图如下: Activity有如下四种状态 a.活动状态 activity处于屏幕前台,获取到了焦点可以和用户进行交互,同一时刻只有一个a ...
- Android Activity生命周期详讲
管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...
- android Activity生命周期(设备旋转、数据恢复等)与启动模式
1.Activity生命周期 接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...
- Android Activity生命周期以及Fragment生命周期的区别与分析
Android Fragment生命周期图: Activity生命周期图: 对照图: Fragment生命周期分析: 1. 当一个fragment被创建的时候,它会经历以下状态. onAttach() ...
- Android Activity 生命周期详解
学习android开发这么久对于activity的生命周期还没有仔细思考过,所以,我大致的把这些东西整理一下,希望通过这使自己理解的更透彻点吧! 首先看一下Activity生命周期图和它的的四个阶段 ...
- xamarin Android activity生命周期详解
学Xamarin我为什么要写这样一篇关于Android 的activity生命周期的文章 已经学Xamarin android有一段时间了,现在想起当初Xamarin也走了不少的弯路.当然Xamari ...
- Android——Activity生命周期(转)
Activity生命周期 子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细 ...
- android --Activity生命周期具体解释
一. 再探Activity生命周期 为了研究activity的生命周期,简单測试代码例如以下. package com.example.testactivity; import android.app ...
随机推荐
- Hihocoder 之 #1097 : 最小生成树一·Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)
#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...
- Shell 脚本实现 Linux 系统监控
一.实验介绍 1.1 实验内容 本课程实现 shell 脚本监控系统的各项参数,并可以将脚本加入系统环境中,可以直接在终端里执行.还添加了几个参数,一个脚本可以执行不同的操作. 1.2 知识点 本实验 ...
- hadoop部署之防火墙
在部署hadoop时,好多资料上都写了要关闭防火墙,如果不关闭可能出现节点间无法通信的情况,于是大家也都这样做了,因此集群通信正常.当然集群一般是处于局域网中的,因此关闭防火墙一般也不会存在安全隐患, ...
- C++标准编程:虚函数与内联
我们曾经在讨论C++的时候,经常会问到:“虚函数能被声明为内联吗?”现在,我们几乎听不到这个问题了.现在听到的是:“你不应该使print成为内联的.声明一个虚函数为内联是错误的!” 这种说法的两个主要 ...
- bzoj2660最多的方案——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2660 首先,多种方案的出现是因为一个较大的斐波那契数可以变成两个较小的: 用一个01串来表示 ...
- Linux终端那件事儿
我们将会讨论如何更好的控制用户终端:也就说是键盘输入与屏幕输出.除了这些,我们还会了解我们编写的程序如何由用户处读取输入,即使是在输入重定向的情况下,以及确保输出到屏幕的正确位置.这里所提供的一些底层 ...
- [转]Python+Selenium之expected_conditions:各种判断(上)
原文地址: https://www.jianshu.com/p/f3189f1951cc 其他类似文章: https://www.cnblogs.com/yuuwee/p/6635652.html h ...
- 6-5 Haar特征2
在遍历的过程中还需要考虑到一个步长的问题.这个模板一次滑动10个像素,那么总共就需要滑动9次.再加上最开始的第0次,合计在水平方向上和竖直方向上分别都有10个这样的模板,总共也就是100个模板.要计算 ...
- UVaLive 6950 && Gym 100299K Digraphs (DFS找环或者是找最长链)
题意:有n个只包含两个字母的字符串, 要求构造一个m*m的字母矩阵, 使得矩阵的每行每列都不包含所给的字符串, m要尽量大, 如果大于20的话构造20*20的矩阵就行了. 析:开始吧,并没有读对题意, ...
- python __builtins__ enumerate类 (21)
21.'enumerate', 用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. class enumerate(object ...