博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Activity生命周期详解
阅读量:6535 次
发布时间:2019-06-24

本文共 3299 字,大约阅读时间需要 10 分钟。

hot3.png

       四大组件之一的Activity组件,在应用中一个Activity可以用来表示一个界面,中文意思也可以理解为“活动”,即一个活动开始,代表Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。

      有时间的童鞋还可以去理解以下四个基本概念,将有助于我们更好的了解Android系统内部机制:

Application、Activity、Activity栈、Task

153124_IojZ_2296916.jpg

三大基本状态:

  1. Resumed:一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。

  2. Paused:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦健,所以不可与用户交互。

  3. Stoped:当Activity被另外一个Activity覆盖、失去焦点并不可见时处于的状态。    

Activiy的生命周期:

  1. onCreate(Bundle savedInstanceState);

  2. onStart();

  3. onRestart();

  4. onResume();

  5. onPause();

  6. onStop();

  7. onDestroy();

    Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码:

public class Activity extends ApplicationContext {       protected void onCreate(Bundle savedInstanceState);               protected void onStart();                  protected void onRestart();               protected void onResume();              protected void onPause();               protected void onStop();               protected void onDestroy();}

       为了便于理解,我们可以写一个Demo,通过一定的操作来观察Activity在生命周期中状态的变化情况。

第一步:新建一个Android工程,我这里命名为ActivityDemo.

第二步:修改ActivityDemo.java(我这里重新写了以上的七种方法,主要用Log打印),代码如下:

package com.example.activityins;import android.app.Activity;import android.os.Bundle;/** * Activity的三大状态和七大生命周期方法分析 */public class MainActivity extends Activity {	/**	 * Activity创建时第一个调用的方法,通常我们再该方法中加载布局文件,初始化UI组件,事件注册等等	 */	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		System.out.println("MainActivity-onCreate");	}	/**	 * 再onCreate方法之后调用,用于显示界面,但当前用户还不能进行交互	 */	@Override	protected void onStart() {		super.onStart();		System.out.println("MainActivity-onStart");	}	/**	 * 当activity从stopped状态下被返回时调用,之后再调用onResume方法进入resumed状态	 */	@Override	protected void onRestart() {		super.onRestart();		System.out.println("MainActivity-onRestart");	}	/**	 * 在onStart方法后调用,执行完了该方法后,用户可进行交互,当前Activity进入resumed状态	 * 当activity从Paused状态被重新返回时,会再次调用该方法,让Activity进入resumed状态	 */	@Override	protected void onResume() {		super.onResume();		System.out.println("MainActivity-onResume");	}	/**	 * 当其他Activity(透明或窗口模式)进入时,调用该方法,让当前Activity进入paused状态	 * 当前Activity依然是可见状态,但不可交互。如果其他更高优先级的APP需要内存时,当前Activity可能会被销毁	 * 当前Activity被返回时调用onResume方法	 */	@Override	protected void onPause() {		super.onPause();		System.out.println("MainActivity-onPause");	}	/**	 * 当其他Activity完全覆盖该Activity时,调用该方法,当前Activity进入stopped状态	 * 当前Activity是不可见状态。如果其他更高优先级的APP需要内存时,当前Activity可能会被销毁	 * 当前Activity被返回时调用onRestart方法	 */	@Override	protected void onStop() {		super.onStop();		System.out.println("MainActivity-onStop");	}	/**	 * 当前activity被销毁时调用,通常在该方法中用来释放资源,当前activity被kill掉	 */	@Override	protected void onDestroy() {		super.onDestroy();		System.out.println("MainActivity-onDestroy");	}}

接下来就是测试了,我们一边操作一边观察LogCat中的打印:

第一步:启动项目

在这一步骤中,Activity先后执行了onCreate()->onStart()->onResume()三个方法。

155905_hSiz_2296916.png

第二步:点击HOME键回到桌面

执行了onPause()->onStop()两个方法,这个时候,activity依然存在,只是我们看不到了,但并没有被销毁。

160203_AgZ8_2296916.png

第三步:再次点击应用图标回到程序中,恢复页面

执行了onRestart()->onStart()->onResume()三个方法

160437_DxQT_2296916.png

第四步:点击BACK键退出程序

执行了onPause()->onStop()->onDestroy()三个方法,这个时候,程序被销毁。

160610_lRqF_2296916.png

第五步:在启动程序(也就是第一步)后,我们点击电源键锁屏

160854_4t0A_2296916.png

第六步:点击电源键点亮屏幕,并解锁

161037_6gPM_2296916.png

还有其他的情况,比如,在第一步后面,从任务切换的地方进入另一个应用程序,然后再回到我们的测试程序中,等等。

这些大家可以自己下来试一试。

现在,我们再回到上面去看Activity生命周期图,相信大家都能很容易的理解这张图了。

转载于:https://my.oschina.net/u/2296916/blog/509702

你可能感兴趣的文章
JavaScript中的正则表达式解析
查看>>
perl脚本实时监测重要网络设备以及服务器的连通性
查看>>
An internal error occurred during: "Launching 项目名 on Tomcat 7.x". java.lang.NullPointerException...
查看>>
Java编程最差实践(二)
查看>>
IPv6笔记(四)
查看>>
Linux中一切皆文件
查看>>
shell下的字符串截取方法
查看>>
spotlight安装
查看>>
哈希表的实现
查看>>
nfs学习笔记
查看>>
两周的
查看>>
帮助你在不同尺寸屏幕下浏览网站效果的工具 - Responsivator
查看>>
【Best Practice】基于阿里云数加·StreamCompute快速构建网站日志实时分析大屏
查看>>
聊聊JerseyEurekaHttpClient的参数
查看>>
PHP发送邮件
查看>>
Smb服务器搭建
查看>>
PERL 常用代码(持续增加)
查看>>
批量添加监控IP
查看>>
我国.COM域名总量近445万个 仅次美国居第二
查看>>
《2017中国开发者调查报告》重磅发布!代码谱写传奇,深度揭秘中国开发者现状!...
查看>>