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

Activity生命周期

熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要继承相应的基类,重写它的方法,这些方法会在合适的时间被servlet容器调用。其实android中的Activity运行机制跟servlet有些相似之处,Android系统相当于servlet容器,Activity相当于一个servlet,我们的Activity处在这个容器中,一切创建实例、初始化、销毁实例等过程都是容器来调用的,这也就是所谓的“Don't call me, I'll call you.”机制。

我们来看一下这一张经典的生命周期流程图:

相信不少朋友也已经看过这个流程图了,也基本了解了Activity生命周期的几个过程,我们就来说一说这几个过程。

1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

但是知道这些还不够,我们必须亲自试验一下才能深刻体会,融会贯通。

下面我们就结合实例,来演示一下生命周期的几个过程的详细情况。我们新建一个名为lifecycle的项目,创建一个名为LifeCycleActivity的Activity,如下:

package com.scott.lifecycle;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class LifeCycleActivity extends Activity {

private static final String TAG = "LifeCycleActivity";
private Context context = this;
private int param = 1;

//Activity创建时被调用
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate called.");

setContentView(R.layout.lifecycle);

Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, TargetActivity.class);
startActivity(intent);
}
});
}

//Activity创建或者从后台重新回到前台时被调用
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart called.");
}

//Activity从后台重新回到前台时被调用
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart called.");
}

//Activity创建或者从被覆盖、后台重新回到前台时被调用
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume called.");
}

//Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后
/*@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.i(TAG, "onWindowFocusChanged called.");
}*/

//Activity被覆盖到下面或者锁屏时被调用
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause called.");
//有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据
}

//退出当前Activity或者跳转到新Activity时被调用
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop called.");
}

//退出当前Activity时被调用,调用之后Activity就结束了
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestory called.");
}

/**
* Activity被系统杀死时被调用.
* 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死.
* 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.
* 在onPause之前被调用.
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("param", param);
Log.i(TAG, "onSaveInstanceState called. put param: " + param);
super.onSaveInstanceState(outState);
}

/**
* Activity被系统杀死后再重建时被调用.
* 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
* 这两种情况下onRestoreInstanceState都会被调用,在onStart之后.
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
param = savedInstanceState.getInt("param");
Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
super.onRestoreInstanceState(savedInstanceState);
}
}

转载于:https://www.cnblogs.com/lixiaolun/p/3578870.html

相关文章:

  • 加入域,找不到网络路径的解决办法
  • 跟你分享一下养生的经验
  • Java UDP 示例
  • Exchange Server 2003邮件服务器系统的基本部署思路
  • HTTP请求头详解【转】
  • 2007-5-30
  • apache下ab.exe使用方法。。
  • 最常用的20个ASP代码片段 上
  • 如何快速解救野外被困人员
  • ASP.NET DEMO Ⅳ : 使用数据源控件将数据绑定到 ListControl 上
  • java synth实例
  • 心理年龄测试:准专业的心理年龄鉴定测试
  • Linux 文件系统
  • Asp.net连接Oracle数据库的连接池问题(ZT)
  • 创业者要殷勤巴结的几类人
  • 分享一款快速APP功能测试工具
  • 【css3】浏览器内核及其兼容性
  • 2017-08-04 前端日报
  • echarts的各种常用效果展示
  • httpie使用详解
  • JDK9: 集成 Jshell 和 Maven 项目.
  • leetcode98. Validate Binary Search Tree
  • Linux后台研发超实用命令总结
  • python docx文档转html页面
  • Python学习之路13-记分
  • quasar-framework cnodejs社区
  • ReactNativeweexDeviceOne对比
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 那些年我们用过的显示性能指标
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # dbt source dbt source freshness命令详解
  • #NOIP 2014# day.2 T2 寻找道路
  • #vue3 实现前端下载excel文件模板功能
  • (3) cmake编译多个cpp文件
  • (编译到47%失败)to be deleted
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (算法二)滑动窗口
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .NET gRPC 和RESTful简单对比
  • .net SqlSugarHelper
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .Net多线程Threading相关详解
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .vimrc 配置项
  • :O)修改linux硬件时间
  • @NestedConfigurationProperty 注解用法
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性