技术标签: android
Android中最常用的无非就是Activity,
而精通其中的原理和生命周期也是一个Android程序员必备的技能,包括在面试的时候很多问题都会涉及到activity生命周期。
当我们启动一个app的时候,其实就已经开始了activity的生命,
而这一开始的activity就是MainActivity,基本在我们创建应用的时候就存在了。
下面一张图来帮助我们了解生命周期。
Activity中一共有七大生命周期,来控制整个应用的活动,
从onCreate()开始
到onDestory()结束
已经用掉了两条命
真正需要我们折腾的是剩下的5条命。
关于返回栈(Task),在《第一行代码Android第二版》书中解释是
其实Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里活动的集合,这个栈也被称为返回栈(Back Stack)。
通俗的理解就是说,每一次启动一个新的Activity,然后这个启动的活动就被存放在返回栈中,并且处于栈顶的位置。这个过程称为入栈。
反之当一个活动结束-Activity被销毁(finsh())的时候,或者按下了返回键(back)那么这个活动的activity就会被当做垃圾清理出去。这个过程称为出栈
因为返回栈是一个集合,用数组的形式存放Activity活动的,所以在启动Activity的时候,数组中就会在栈顶增加一个活动,而之前处于栈顶的活动自动给新来的让位。所以我们总是能看到最新的界面。
Activity生命周期
当我们打开一个Activity的时候会执行生命周期中的onCreate()、onState()、onResume()这三个方法,
onCreate()
用于加载布局,加载数据,实例化控件、监听,等。返回栈收到请求加入指令。
onState()
将开启活动,由于布局,数据是不可见,静态的,当启动该方法时,将其变为可见,活动的。也可以理解为活动通过指令,开始存放到返回栈中。
onResume()
加载完成静态时执行的活动,这时候活动已处于栈顶。并且用户可见,可操作控件,就像一个出列等待命令的将士。
接着要进行下一步,打开另一个Activity,那么之前的Activity还需要继续走完他的生命周期,于是又开始执行:
onPause()
到这里收到准备撤的命令,但是还没行动,此时活动依然处于栈顶的位置。页面处于可见状态。
但是这时候突然士兵想去wc怎么办,或者行李没带?吃一碗他媳妇给他送行的面?。这时候就要返回一下,比如弹个窗口,上面挂着吃饭的牌子,吃完后再进入待命状态,那么这期间的一个小动作就执行了
onResume()
利用交互改变状态。
onPause()
这时候的士兵可能就是一个吃饱饭,或者饿着肚子的,都有可能,然后依然是等候命令,可能没有饭吃了,于是:
onStop()
撤退,页面已经被新的Activity覆盖,新的Activity占据了栈顶。原Activity不可见。活动停止
你以为这就结束了?当然没有,君子报仇十年不晚,无论新的Activity如何折腾,只要他按下的返回键(back),或者调用了finish(),就会又执行:
onRestart()
重启活动
onStart()
onResume()
但是如果新的Activity刚获得栈顶的位置,又被第三个Activity加入,那么刚开始的Activity就失去了返回(finish()/back)的机会,所以只能结束自己的生命:
onDestory()
终止活动。
我们在开发时,用的最多的就是onCreate,初始化数据。
然后是onResume,刷新数据。
有些网络请求的数据就是在onResume方法执行,因为有可能在我们没有销毁前一个Activity的时候,之前的Activity数据集发生变化,返回直接执行onState,因为该方法只是用来转换静态数据的,而onResume是用来处理交互的。
所以需要在这里刷新数据。
在我们手机上开发者模式中有个保留活动的选项,默认是选中的,如果不保留的话那么在按手机Home键的话,活动就会被销毁也就是执行onDestory,否则是一直停在onStop状态。
有时候我们会发现Home之后再打开的话app重启了,这是因为内存不足,有些手机系统自动帮我们终结掉了无用的活动。
onSaveInstanceState
最后提一下这个方法,可能在我们开发时用的少,在stop方法里左边有个直接返回到onCreate方法里的活动。
指的是进程被杀死的情况,有可能是处于后台运行时被杀死,再进来就会重新执行onCreate,过程中会产生该方法。
从字面很容易理解,就是保存实例。因为当活动被杀死后,页面修改过的内容就会丢失,比如一些设置还没保存,修改信息未提交这种。
那么利用onSaveInstanceState就可以保存临时数据。
使用方法:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key","value");
}
......
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.httptest);
savedInstanceState.getString("key");
}
BUG
1、
如果我们在onResume进行网络数据请求的话,可能出现一个冲突,在进去Activity的时候,我们设置的默认布局会优先加载,如果网络差的话,网络数据一直加载不出来,所显示的就是默认我们后台写死的布局。
如果涉及到相关操作需要网络加载完成操作的可以提前把按钮设置为隐藏、或者设置gone,还可以设置加载中效果,推荐设置加载等待效果。
2、
Fragment生命周期是依赖于Activity生命周期的,比如MainActivity下有四个Fragment,当Fragment里面的Activity活动发生变化可以直接影响到整个MainActivity,当然也包括四个Fragment。
所以当我们在操作Fragment里面的Activity活动的时候,要注意在返回的时候通知Fragment里的数据更新,或者是把数据请求的方法直接在Fragment的onResume方法里实现。
END
由于本来对生命周期的了解都不够全面,加之最近项目中遇到的一些小毛病,也是跟生命周期相关,所以就参考了一些资料,以个人的思路做了理解。
有不足的地方还望多指出!
参考资料:
《第一行代码》
Android任务和返回栈完全解析,细数那些你所不知道的细节
注解的使用参考资料:https://www.liaoxuefeng.com/wiki/1252599548343744/1265102413966176 。一 简介可使用范围:类、方法、字段、参数。类型(大致三类):1 编译器使用的注解这类注解不会被编译进入.class文件,它们在编译后就被编译器扔掉了。比如:@Override、@SuppressWarnings。2 由工具处理.class文件使用的注解有些工具会在加载class的时候,对class做动态修改,实现一些特
望着这一个个在线的qq,却无从谈起,不知该如何下手。放眼看看,有几个可以随心而谈,有几个想却又不能开口。如同电话簿中有几个能借钱一般的尴尬。或许陌生人之间的仁慈勉强可搭讪。看着,发出的信息却无回复,有种莫名的悲哀……
c++11 可变参数模板函数#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <vector>#include <map>// 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模...
在不少游戏中,我们都可能会出现这样的场景,我们在一个建筑内行走,这个建筑有房间也有走廊,这时候在漫游中就有这样一个要求:人不能穿墙。当人物不被绘制而是以人物视野来代替时,这个问题就抽象为漫游时视点与场景碰撞检测的问题,可以看出它和标准的碰撞检测是有区别的,一般的碰撞检测问题考虑的是两个包围盒是否存在交,而在这里我们把可以把问题变得更容易,判断视线与包围盒是否存在交,如果存在,进行怎样的修补保证不穿
wkhtmltopdf 有个很好的方法,就是在那个div的样式后添加一个:page-break-inside:avoid;就ok了。&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&...
文章目录1.配置petalinux运行环境2.petalinux设计流程简介3.petalinux使用实战1.配置petalinux运行环境安装好petalinux后,在对应的文件夹中有一个 settings.sh 文件,每次打开终端后需要打开对应路径 source 它,以配置运行petalinux所需的环境变量。source settings.sh如觉得麻烦,方式1:可以将上述命令改为绝对路径的方式,添加到home路径下的.bashrc文件中,之后每次打开新的终端都会运行这个命令。so
Servlet就是一种懒汉模式,懒汉变饿汉,在web.xml配置文件中的< servlet>标签中加入< load-on-startup>< /load-on-startup>
Each time I play a video and lock the iPhone by pushing the power button, the video is automatically stopped. If I want to play a MTV and just listen to the music when I walking, I’d like the video pl...
十九GUI图形用户界面1.AWTabstract Windowing Toolkit 抽象窗口工具包用来建立和设置java的图形用户界面的基本工具AWT所有工具类都在awt包中,用来建立与平台无关的GUI类,这些类被称为组件[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7iPwKMVE-1603897518226)(C:\Users\lgm\AppData\Roaming\Typora\typora-user-images\1603846286463.png)]
数据泵:属于逻辑备份的范围,将数据转储为一个dmp文件。优点:支持并发多线程方式,性能显著提高,比exp/imp实用工具相比,导出提高了10倍左右,导入提高了5倍左右。能根据备份时收集的元数据,自动创建用户、表对象,支持作业、表空间备份方式。缺点:需要在服务器上面执行 创建目录 授权(可以远程导出)(exp不支持字段类型,BINARY_DOUBLE双精度二进制浮点类型 http
Linux编译程序时如果找不到头文件会提示如下错误:$ gcc test.c -o testtest.c:9:16: fatal error: xxx.h: No suchfile or directory #include 下面叙述以Ubuntu系统为例。先查找 xxx.h 所在路径:$ sudo find / -name xxx.h/usr/local/incl
一、RSA算法简介 RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进