文章目录

  • Activity 的状态及生命周期
  • 实现管理生命周期
    • FirstActivity
    • SecondActivity
    • DialogActivity
    • 运行结果
  • 旧活动被回收了还能返回吗?

Activity 的状态及生命周期

Android 的应用程序运用 栈(Back Stack) 的思想来管理 Activity:

  • 每创建一个新活动,就会覆盖在旧活动之上,相当于压入栈。
  • 每当按下 返回键(Back) 或者调用 finish() ,就会销毁栈顶的 Activity,相当于弹出栈。

Activity 有四种状态:

  • 运行:在栈顶时运行。
  • 暂停:不再处于栈顶、但屏幕上可见时暂停。
  • 停止:不再处于栈顶且屏幕上不可见时停止。
  • 销毁:弹栈后销毁。

Activity 类定义了七个回调方法,覆盖了整个 Activity 生命周期:

  • onCreate() :活动首次创建时;
  • onStart() :活动由不可见变为可见;
  • onResume() :活动位于栈顶且准备好与用户交互;
  • onPause() :在系统准备去启动或者恢复另一个活动时调用,通常会释放一些占用 CPU 的资源,保存一些关键数据;
  • onStop() :活动完全不可见时调用,如果新活动不是对话框式则调用 onStop,否则调用 onPause
  • onDestroy() :将活动变为销毁状态;
  • onRestart() :将活动由停止变为运行。


实现管理生命周期

创建三个 Activity 文件以实现研究生命周期。

FirstActivity

FirstActivity 中添加两个按钮分别实现启动 普通活动对话框式活动,并添加七个生命周期方法:

public class FirstActivity extends AppCompatActivity {private static final String TAG = "FirstActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.first_layout);Button button_normal = (Button)findViewById(R.id.button_normal);button_normal.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(FirstActivity.this,SecondActivity.class);startActivity(intent);}});Button button_dialog = (Button)findViewById(R.id.button_dialog);button_dialog.setOnClickListener((View view)->{Intent intent = new Intent(this, DialogActivity.class);startActivity(intent);});}@Overrideprotected void onStart() {super.onStart();Log.d(TAG, "onStart: ");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG, "onResume: ");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG, "onPause: ");}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, "onStop: ");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy: ");}@Overrideprotected void onRestart() {super.onRestart();Log.d(TAG, "onRestart: ");}
}

first_layout.xml 实现 FirstActivity 的具体布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/button_normal"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="normal"></Button><Buttonandroid:id="@+id/button_dialog"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="dialog"></Button></LinearLayout>

SecondActivity

SecondActivity 作为一个普通活动,供 FirstActivitybutton_normal 跳转调用,其 button2 提供一个能拨号 10086 的 intent

public class SecondActivity extends AppCompatActivity {private static final String TAG = "SecondActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second_layout);Button button2 = findViewById(R.id.button_2);button2.setOnClickListener((View view)->{Intent intent = new Intent(Intent.ACTION_DIAL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);});}
}

second_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".SecondActivity"><Buttonandroid:id="@+id/button_2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="button_2"/></LinearLayout>

DialogActivity

创建 DialogActivity 文件,旨在实现一个对话框式的活动:

public class DialogActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.dialog_layout);}
}

想要让其实现对话框式,需要对其 activity 标签做出如下修改:

通过 android:theme 指定 DialogActivity 的主题。

PS: 书上是这么写的 android:theme="@android:style/Theme.Dialog" ,这是 Activitytheme,但我们默认生成的 DialogActivity 继承的是 AppCompatActivity,所以就要使用与其配合的 AppCompat 的 theme 才行。

dialog_layout.xml 文件设计布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="Dialog Activity"/></LinearLayout>

运行结果

点击运行,首先显示的是 FirstActivity 的界面:

此时查看 logcat,生命周期执行到 onResume 阶段:

点击 NORMAL 按钮,跳转到 SecondActivity 界面:

因此 onPause() —— FirstActivity 启动另外一个活动 SecondActivityonStop() —— SecondActivity 需要占满整个屏幕,因此 FirstActivity 停止,都会被执行:

按下 Back 键返回 FirstActivity 界面,观察 logcat


由于 FirstActivity 已经进入停止状态,因此执行 onRestart():由停止变为运行,之后重新执行 onStart() :由不可见变为可见onResume :准备好与用户交互。之所以不执行 onCreate() ,是因为 FirstActivity 没有重新创建。

点击 DIALOG 按钮,跳转到 DialogActivity 界面:
此时 logcat 只有一条日志信息:

没有调用 onPause() 是因为 DialogActivity 并没有占满整个屏幕,FirstActivity 只是进入了暂停状态,没有进入停止状态。

同理按下 Back 键也只会执行 onResume() 方法,因为不用从停止状态重新变为运行。

最后在 FirstActivity 界面点击 Back 键退出程序,会依次执行:

之后便销毁了 FirstActivity。


旧活动被回收了还能返回吗?

A 活动启动 B 活动,假如此时内存空间不足,系统将 A 活动进行回收了,这时点击 Back 还能返回 A 吗?

其实 A 还是会正常显示的,只不过这时并不会执行 onRestart() 方法,而是执行 oncreate() 方法,A 会被重新创建一次。唯一的问题是 A 中暂存的临时数据都丢失了。

Activity 中提供了一个 onSaveInstanceState 的回调方法,活动在被回收之前一定会调用该方法,从而解决活动被回收时临时数据得不到保存的问题。

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);
}

将一些重要的临时数据保存在 Bundle 中,然后在 onCreateBundle 变量中提取数据。

onCreateBundle 一般都为 null ,但是如果在活动被系统回收之前有通过 onSaveInstanceState() 方法来保存数据的话,这个参数就会带有之前所保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可。

Android入门(五) | Activity 的生命周期相关推荐

  1. Android组件系列----Activity的生命周期

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  2. Android开发之Activity的生命周期详解

    Android生命周期分为两部分: (1)典型情况下的生命周期. (2)异常情况下的生命周期. 典型情况下的生命周期分析 ​图1 Activity的生命周期图解 ​图2 Activity生命周期的金字 ...

  3. Android教程 -06 Activity的生命周期

    本篇播客我们重点介绍下如下知识点: 程序启动原理 Activity生命周期 Activity销毁与创建 视频建议采用超清模式观看, 欢迎点击订阅我的优酷 height="498" ...

  4. Android笔记之Android基本控件布局与Activity的生命周期

    前言 喜欢安卓里千奇百怪的app,酷炫的UI或者好玩的游戏.想知道那些软件是如何做的,为什么我在微博里发一条消息,就能一直存在网上,让别人看到?为什么我点击一个按钮就出现了一个效果,某个功能?为什么滑 ...

  5. 详解android之activity的生命周期

    android中用到最多的就是activity,它也是android的四大组件之一,开发过程中也是最常用到的组件,所以我们有必要去掌握它在程序运行的生命周期是怎么回事 在了解activity的生命周期 ...

  6. Android开发---Activity的生命周期

    在Android开发中,第一步学习的应该是最基础的东西,即Activity的声明周期,相信Activity对于从事Android开发的朋友都很熟悉,这里作者不多做解释.Android的生命周期可以用如 ...

  7. android的应用入口点函数,android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明...

    android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a ...

  8. Android学习笔记系列四2 —— Activity的生命周期

    2019独角兽企业重金招聘Python工程师标准>>> 启动一个Activity 使用startActivity(Intent intent). intent指定了你想要启动的act ...

  9. android activity 回调函数,Android Activity的生命周期

    Activity的生命周期 Android系统根据activity的所处不同阶段对应的唤起其特定的回调函数来执行代码.activity的一系列有序的生命周期回调函数.本文将来讨论下activity各阶 ...

  10. Android 中 Activity 的生命周期

    接触 Android 有一段时间了,但是今天才去看 Activity 的生命周期,着实是因为在项目中用到了,需要去关闭释放一些数据. 以下内容来自网络,说的很直白,我就不用整理了 onCreate() ...

最新文章

  1. 步进电机正反转实验_电工基础:帮你学会电机正反转双重互锁控制
  2. 剑指offer 算法 (代码的完整性)
  3. C+ 轮融资发布会抽奖名单公布,还有 20 万礼物正在路上
  4. P5217 贫穷 平衡树
  5. mysql查询一个数据库所有表的记录数,mysql 查看数据库中所有表的记录数
  6. IntelliJ IDEA 创建Java Web项目
  7. 函数调用的汇编语言详解
  8. 拉普拉斯分布_理解拉普拉斯特征映射中的优化问题的约束条件
  9. Charades数据集
  10. 分布式 | log4j2 漏洞修复方案
  11. 计算机职业素养论文1500字,职业素养课后感想1500字
  12. 常见的加密算法原理与实现:MD5加密
  13. stm32串口控制LED灯
  14. Word里仅修改字母和数字的字体,不改变标点符号字体
  15. 了解函数式编程背后的属性:单子(Monad)
  16. ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植
  17. 利用sql profile固定执行计划加快OGG同步
  18. 《股票魔法师》第3-5章读书分享
  19. Android Studio实现有趣的星座配对APP
  20. Docker基础之安装部署

热门文章

  1. python socket send_python socket 连续send,出现粘包问题
  2. python爬虫ip限制_简单爬虫,突破IP访问限制和复杂验证码,小总结
  3. cpu工作原理flash动画_17张PLC工作原理动画,每一个都是经典
  4. Ubuntu 14.04 文件服务器--samba的安装和配置
  5. a5d27 emmc启动 修改2
  6. PJSIP学习笔记——从simple_pjsua.c示例程序了解PJSUA-LIB的基本使用流程
  7. 【转】[程序集清单定义与程序集引用不匹配]分析及解决
  8. 【转】DCM(DICOM)医学影像文件格式详解
  9. 【转】EntityFramework使用Code First模式创建数据库控制生成单数形式的表名
  10. 【转】关于Azure存储账户(2)