Android入门(五) | Activity 的生命周期
文章目录
- 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
作为一个普通活动,供 FirstActivity
的 button_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"
,这是 Activity 的 theme
,但我们默认生成的 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 启动另外一个活动 SecondActivity 和 onStop()
—— 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
中,然后在 onCreate
的 Bundle
变量中提取数据。
onCreate
的 Bundle
一般都为 null
,但是如果在活动被系统回收之前有通过 onSaveInstanceState()
方法来保存数据的话,这个参数就会带有之前所保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可。
Android入门(五) | Activity 的生命周期相关推荐
- Android组件系列----Activity的生命周期
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android开发之Activity的生命周期详解
Android生命周期分为两部分: (1)典型情况下的生命周期. (2)异常情况下的生命周期. 典型情况下的生命周期分析 图1 Activity的生命周期图解 图2 Activity生命周期的金字 ...
- Android教程 -06 Activity的生命周期
本篇播客我们重点介绍下如下知识点: 程序启动原理 Activity生命周期 Activity销毁与创建 视频建议采用超清模式观看, 欢迎点击订阅我的优酷 height="498" ...
- Android笔记之Android基本控件布局与Activity的生命周期
前言 喜欢安卓里千奇百怪的app,酷炫的UI或者好玩的游戏.想知道那些软件是如何做的,为什么我在微博里发一条消息,就能一直存在网上,让别人看到?为什么我点击一个按钮就出现了一个效果,某个功能?为什么滑 ...
- 详解android之activity的生命周期
android中用到最多的就是activity,它也是android的四大组件之一,开发过程中也是最常用到的组件,所以我们有必要去掌握它在程序运行的生命周期是怎么回事 在了解activity的生命周期 ...
- Android开发---Activity的生命周期
在Android开发中,第一步学习的应该是最基础的东西,即Activity的声明周期,相信Activity对于从事Android开发的朋友都很熟悉,这里作者不多做解释.Android的生命周期可以用如 ...
- android的应用入口点函数,android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明...
android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a ...
- Android学习笔记系列四2 —— Activity的生命周期
2019独角兽企业重金招聘Python工程师标准>>> 启动一个Activity 使用startActivity(Intent intent). intent指定了你想要启动的act ...
- android activity 回调函数,Android Activity的生命周期
Activity的生命周期 Android系统根据activity的所处不同阶段对应的唤起其特定的回调函数来执行代码.activity的一系列有序的生命周期回调函数.本文将来讨论下activity各阶 ...
- Android 中 Activity 的生命周期
接触 Android 有一段时间了,但是今天才去看 Activity 的生命周期,着实是因为在项目中用到了,需要去关闭释放一些数据. 以下内容来自网络,说的很直白,我就不用整理了 onCreate() ...
最新文章
- 步进电机正反转实验_电工基础:帮你学会电机正反转双重互锁控制
- 剑指offer 算法 (代码的完整性)
- C+ 轮融资发布会抽奖名单公布,还有 20 万礼物正在路上
- P5217 贫穷 平衡树
- mysql查询一个数据库所有表的记录数,mysql 查看数据库中所有表的记录数
- IntelliJ IDEA 创建Java Web项目
- 函数调用的汇编语言详解
- 拉普拉斯分布_理解拉普拉斯特征映射中的优化问题的约束条件
- Charades数据集
- 分布式 | log4j2 漏洞修复方案
- 计算机职业素养论文1500字,职业素养课后感想1500字
- 常见的加密算法原理与实现:MD5加密
- stm32串口控制LED灯
- Word里仅修改字母和数字的字体,不改变标点符号字体
- 了解函数式编程背后的属性:单子(Monad)
- ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植
- 利用sql profile固定执行计划加快OGG同步
- 《股票魔法师》第3-5章读书分享
- Android Studio实现有趣的星座配对APP
- Docker基础之安装部署
热门文章
- python socket send_python socket 连续send,出现粘包问题
- python爬虫ip限制_简单爬虫,突破IP访问限制和复杂验证码,小总结
- cpu工作原理flash动画_17张PLC工作原理动画,每一个都是经典
- Ubuntu 14.04 文件服务器--samba的安装和配置
- a5d27 emmc启动 修改2
- PJSIP学习笔记——从simple_pjsua.c示例程序了解PJSUA-LIB的基本使用流程
- 【转】[程序集清单定义与程序集引用不匹配]分析及解决
- 【转】DCM(DICOM)医学影像文件格式详解
- 【转】EntityFramework使用Code First模式创建数据库控制生成单数形式的表名
- 【转】关于Azure存储账户(2)