当前位置: 首页 > news >正文

Android Activity生命周期详解

2019独角兽企业重金招聘Python工程师标准>>> 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

相关文章:

  • Python+Appium自动化环境搭建
  • Unity3D之Legacy动画系统学习笔记
  • 联想关键业务服务器 sysytem X3850 X6 4U机架式服务器
  • mysql 字符集乱码及解决方案
  • android搜索框列表布局,流程及主要步骤思维导图
  • gcc介绍及安装
  • java 中获得 资源文件方法
  • IF
  • oracle导出、导入的一次实战
  • hadoop集群管理系统搭建规划说明
  • wsdl自动生成Java代码,根据wsdl生成Java代码
  • 企业上云之机房和BGP带宽篇(三)
  • ios导航栏自定义返回按钮后,多出蓝点bug
  • 云盘关闭,教你用蒲公英搭建私有云
  • 显示MYSQL数据库信息
  • 11111111
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • JavaScript函数式编程(一)
  • Phpstorm怎样批量删除空行?
  • SQLServer之索引简介
  • Vue学习第二天
  • 二维平面内的碰撞检测【一】
  • 给Prometheus造假数据的方法
  • 简单易用的leetcode开发测试工具(npm)
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端面试之CSS3新特性
  • 使用SAX解析XML
  • 算法-插入排序
  • 学习Vue.js的五个小例子
  • 译有关态射的一切
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 正则学习笔记
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • !$boo在php中什么意思,php前戏
  • (1) caustics\
  • (16)Reactor的测试——响应式Spring的道法术器
  • (3)(3.5) 遥测无线电区域条例
  • (Matlab)使用竞争神经网络实现数据聚类
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (七)理解angular中的module和injector,即依赖注入
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .cfg\.dat\.mak(持续补充)
  • .NET Framework杂记
  • .net 验证控件和javaScript的冲突问题
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @ConditionalOnProperty注解使用说明
  • @property括号内属性讲解
  • [22]. 括号生成
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [COI2007] Sabor
  • [iOS开发]iOS中TabBar中间按钮凸起的实现
  • [jobdu]不用加减乘除做加法
  • [linux] C语言Linux系统编程进程基本概念
  • [PHP]pearProject协作系统 v2.8.14 前后端