第三章:Activity的生命周期
一:Activity的生命周期方法
Android提供了很多Activity的生命周期方法,比如我们常用的onCreate、onPause、onResume等。这里主要介绍粗粒度的周期方法,诸如onPostCreate、onPostResume等 这些细粒度的周期方法可以参考Android的API文档,在你需要更细层次的控制的时候可以使用这些细粒度的方法。粗粒度的周期方法有以下几个: onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy(),从名字上就可以看出来这些方法在什么时候执行。
二:测试Activity的生命周期方法的执行顺序
为了能更明白上这几个周期放的执行顺序,我们新建一个HelloWorld项目,在Activity中覆盖这几个方法,打印出日志就可以看出来执行顺序了
- 新建HelloWorld项目,详细步骤可以参见:
Android教程之三:第一个Android应用,HelloWorld
- 修改main.xml内容为:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="第一个Activity"
- />
- <Button
- android:id="@+id/second"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="打开第二个Activity"/>
- </LinearLayout>
这里主要是为增加一个文本显示和一个按钮用于显示信息和操作。
- 新建布局文件second.xml,内容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="第二个Activity"
- />
- <Button
- android:id="@+id/exit"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="退出"/>
- </LinearLayout>
这里主要是为增加一个文本显示和一个退出按钮用于退出当前Activity。
- 新建一个Activity,名字为SecondActivity,内容如下:
- public class SecondActivity extends Activity {
- private final static String TAG="SecondActivity";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Log.v(TAG, "onCreate");
- setContentView(R.layout.second);
- //退出按钮
- Button btnExit=(Button)findViewById(R.id.exit);
- //为退出按钮设置单击事件
- btnExit.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- finish();//关闭当前Activity,也就是退出
- }
- });
- }
- @Override
- protected void onStart() {
- super.onStart();
- Log.v(TAG, "onStart");
- }
- @Override
- protected void onResume() {
- super.onResume();
- Log.v(TAG, "onResume");
- }
- @Override
- protected void onPause() {
- super.onPause();
- Log.v(TAG, "onPause");
- }
- @Override
- protected void onStop() {
- super.onStop();
- Log.v(TAG, "onStop");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.v(TAG, "onDestroy");
- }
- }
我在各个周期方法了都加了日志信息,便于跟踪Activity的运行过程
- 修改HelloWorld类,内容如下:
- public class HelloWorld extends Activity {
- private final static String TAG="HelloWorld";
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Log.v(TAG, "onCreate");
- setContentView(R.layout.main);
- //打开第二个Activity的按钮
- Button btnSecond=(Button)findViewById(R.id.second);
- //设置单击事件
- btnSecond.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- startActivity(new Intent(HelloWorld.this,SecondActivity.class));
- }
- });
- }
- @Override
- protected void onStart() {
- super.onStart();
- Log.v(TAG, "onStart");
- }
- @Override
- protected void onResume() {
- super.onResume();
- Log.v(TAG, "onResume");
- }
- @Override
- protected void onPause() {
- super.onPause();
- Log.v(TAG, "onPause");
- }
- @Override
- protected void onStop() {
- super.onStop();
- Log.v(TAG, "onStop");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.v(TAG, "onDestroy");
- }
- }
- 运行程序,分析结果,发现当程序启动的时候,日志信息为下图:
由此可见当打开一个Activity的时候,其周期方法执行顺序为:onCreate()->onStart()->onResume(),现在点击“打开第二个Activity”按钮,
当应用从Helloworld这个Activity启动SecondActivity的时候,将依次执行:(First指第一个MainActivity,Second指第二个)
First.onPause(); //在要调用另一个Activity时调用;
Second.onCreate();
Second.onStart(); //被看到
Second.onResume();
First.onStop(); //对应onStart(),是在Activity对用户不可见时调用;
三:分析结果
根据上面例子可见一个Activity在启动的时候会执行onCreate()->onStart()->onResume(),在结束(或离开)的时候会执行onPause()->onStop()->onDestroy(),这就是一个Activity的生命周期。 因此我们要在onCreate方法里把Activity的需要的东西准备好,也就是初始化;在onResume里对Activity里的东西做一些调整;在onPause做一些清理和保存工作(保存持久状态),因为这是最后的 机会,因为onPause完成之前Android不会结束托管Activity类的进程,而之后进程可能被结束。总结一下这几个周期方法的作用:
- onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态。
- onStart():Activity在屏幕上对用户可见时调用
- onResume():Activity开始和用户交互的时候调用,这时该Activity是在Activity栈的顶部。
- onPause():Activity被暂停时调用,也就是你要对你能看到的这个Activity说byebye的时候调用,这里可以做一些清理和保存工作
- onStop():Activity被停止或者Activity变成不可见时调用
- onDestroy():Activity被从内存中移除,一般发生在执行finish方法时或者Android回收内存的时候
好了,最后让我们看一个API提供的Activity的状态图吧,看了他相信你对Activity的生命周期会更了解,如下图:
第三章:Activity的生命周期的更多相关文章
- 《Android开发艺术探索》读书笔记 (1) 第1章 Activity的生命周期和启动模式
第1章 Activity的生命周期和启动模式 1.1 Activity生命周期全面分析 1.1.1 典型情况下生命周期分析(1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRes ...
- 第一章:Activity的生命周期和启动模式
Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息 (一)Activity的生命周期 1.1.1 正常情况下的生命周期 ...
- 第一章——Activity的生命周期
问题总结: 1.Activity完整的生命周期 2.当打开第二个Activity并关闭时候的生命周期. ①.解释为什么onPause()方法不要有耗时操作 3.Activity发生异常重启的时候问题: ...
- Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...
- 第一章01-正常情况下Activity的生命周期
一.Android下能见到的界面 Window Dialog Toast Activity 二.Activity的生命周期分析 典型情况下的生命周期 是指在有用户参与的情况下,Activity所经过 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- 【Android】11.1 Activity的生命周期和管理
分类:C#.Android.VS2015: 创建日期:2016-02-21 一.基本概念 1.必须理解这些方法,否则你编的程序根本就没法在实际项目中使用 当然,如果仅仅是为了玩玩,或者仅仅是作为例子为 ...
- Android开发之Activity的生命周期以及加载模式
本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...
- Activity的生命周期
Activity的生命周期 以往我们实现页面间的跳转都是实例化Intent类的对象,但是页面在我们眼前的出现与消失没有我们所看到的那么简单,它有一个复杂的生命周期,一个页面的出现,被覆盖,再次出现,被 ...
随机推荐
- 42 【docker】run命令
最常用的两个option是,网络端口映射,和文件共享 最基本的启动命令(从image创建一个container并启动):docker run -d <image-name> -d:表示守护 ...
- Android通过手机搭建服务器,WIFI建立热点实现C/S聊天室通信功能
应用效果图: 客户端 ...
- Luogu1613 跑路-倍增+Floyd
Solution 挺有趣的一道题, 仔细想想才想出来 先用$mp[i][j][dis]$ 是否存在一条 $i$ 到 $j$ 的长度为 $2^{dis}$ 的路径. 转移 : ; dis < ba ...
- 创建.NET core的守护进程
http://www.cnblogs.com/savorboard/p/dotnetcore-supervisor.html
- 使用Maven搭建SpringMVC
1.创建Maven Project 注意选择webapp 2.添加Maven依赖 <project xmlns="http://maven.apache.org/POM/4.0.0&q ...
- RQNOJ 3 Jam的计数法
一道模拟题,用的vector比用链表要方便很多,毕竟不需要自己写,因为是递增的,所以每一次你都要去检查最后一位加1之后有没有越界,如果没越界你就可以把他当前的字符删掉替换成他下一位的字符就可以了,如果 ...
- centos7 go ENV 部署
1.wget官网下载go 官网https://golang.org/dl/ 2.解压 tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz 3.配置环境 ...
- js将数组根据条件分组
//将数组根据条件分组 function getTreeDateByParam(list, param, fun){ var data = {}; if(list && list.le ...
- (PMP)第10章-----项目沟通管理
10.1 规划沟通管理 相关方的数量:(n * (n-1))/2 交互式沟通,推式沟通,拉式沟通 沟通管理计划 10.2 管理沟通 电子项目管理工具 电子沟通管理 社交媒体管理 10.3 监督沟通 B
- C# 最齐全的上传图片方法
方法里包括了图片大小限制.图片尺寸.文件内容等等的判断... 该案例是mvc下的demo,支持单张图片上传. public ActionResult Upload() { string imgurl ...