Activity生命周期的学习和验证

16 篇文章 1 订阅
订阅专栏

1.引子

Activity就像是英文词汇本的Abandon,开篇就能碰到,关于Activity生命周期的博客教程非常多,侧面说明Activity非常重要,其中的Activity的生命周期又是重中之重,面试官非常喜欢拿这个作为考点,因为掌握Activity生命周期对提高应用的健壮性具有很大的帮助。因为只看教程不自己总结实践的话,对其理解总会差点意思,自己动手总结了印象才深刻。

2.Activity生命周期

一个Activity具有四个状态:

  1. 活动(active)或运行(running)状态:此时Activity位于栈顶,用户可以与之交互;
  2. 可见(visible)状态:该状态下Activity对用户可见,但失去了焦点,例如弹出一个对话框,对话框变成前景,原Activity变成背景板,进入可见状态,此时Activity还是活着的,一旦对话框消失,Activity立刻回到活动状态;
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q97Zcg70-1586575759198)(./assets/可见.png)]
  3. 停止(stopped)或隐藏(hidden)状态:如果一个Activity完全被另一个Activity遮盖,则进入该状态,该状态下Activity仍保留着原先的状态信息,再次回到前台直接使用这些保留的信息,例如你从知乎的某个答案跳转到微博界面,此时知乎界面是停止状态,当你再次回到知乎界面时,因为保留了跳转时的状态,再次回到知乎界面还是你之前浏览的答案,注意,在停止状态下,如果系统资源紧张的话,则会销毁Activity,当然会把所有Activity保留的状态信息也清除了,这个时候再次回到知乎界面,只能是看一遍开屏广告再从首页开始吧;
  4. 销毁(destroyed)状态:系统终止Activity进程,在内存层面删除Activity。现在安卓手机的清理缓存功能其中一个功能是销毁堆栈中的Activity回收资源。当这个Activity再次向用户展示时,是重新创建后的实例了。就像她还是她,但已经不是你认识的她。

Activity生命周期其实是一个有限状态机,描述Activity对象如何在以上4种状态之间转换的,生命周期如图所示,图中矩形表示当Activity状态跳转时执行的回调方法。彩色椭圆矩形是Activity可以进入的主要状态,当然细心的同学会疑惑,彩色椭圆矩形里写的主要状态和4种状态对不上了,例如没见可见状态啊,个人认为彩色椭圆矩形指的是Activity动作状态,例如启动,运行,销毁,而上述4种状态是所处的静态状态,在周期图里用文字描述里,例如Activity进入可见状态,用The Activity is no longer visible来描述了。
这个图我们也许见过多次,跟词汇本老朋友Abandon一样,这个图非常重要,掌握了这个图,才能叫掌握Activity。
Activity生命周期图
Activity生命周期有三种类型,其一是Activity的整个生命周期(entire lifetime),从onCreate()开始,到onDestroy()结束,也就是从出生到死亡,贯穿了Activity平庸的一生,Activity在onCreate()中完成所有全局状态设置,在onDestroy()中释放所有Activity资源;

其二是可见生命周期(visible lifetime),发生在onStart()onStop()之间,如图所示,为什么叫可见生命周期,这是因为周期开始onStart()和结束onStop()Activity处于可见状态,不过处于可见状态Activity还不能和用户进行交互,只能远观。我们发现其实可见生命周期大多数步骤还是和整个生命周期步骤是重合的,为何还单独提出来呢?因为周期的侧重点不同,在可见生命周期内可重点管理给用户显示所需的资源,例如UI的更改,而整个生命周期则可重点管理维护贯穿整个生命周期的资源。
可见生命周期
最后是前台生命周期(foreground lifetime),发生在onResume()onPause之间在此期间,Activity处于运行状态,能够与用户进行交互。Activity频繁在onResumeonPause之间进行切换-例如设备锁屏和解锁,Activity被其他Activity覆盖和恢复等,因为频繁切换,所以应避免在这个生命周期内执行过多的代码,避免界面卡顿。
前台生命周期
我们注意到,这三个生命周期发生的频度是逐渐增加的,就像时钟的三根针,整个生命周期是时针,步骤最长最多,发生的频度较低,可见生命周期是分针,步骤少一点,前台生命周期是秒针,步骤最少,发生的频度最高,开发者应根据这三类生命周期的特点,合理安排Activity所需资源的加载。
在这里插入图片描述

3.生命周期回调方法

3.1 生命周期回调方法介绍

我们来看一下生命周期里每一个环节的回调方法

  1. onCreate()
      Activity第一次创建时调用该方法,可在该方法中完成Activity初始化操作,例如创建视图,绑定按钮事件或其他全局性的资源加载。这是Activity整个生命周期的开始。

  2. onStart()
    当活动对用户可见时调用,是Activity可见生命周期的开始。

  3. onResume()
    当Activity开始与用户互动时调用。 此时Activity位于堆栈的顶部并处于运行状态。是Activity前台生命周期的开始。

  4. onPause()
      当Activity失去焦点或者即将隐藏/停止或销毁时调用,执行该方法期间Activity对用户仍可见,直到另一个Activity覆盖,一个比较相似的例子是游戏加载,在加载完新场景之前原场景一直对玩家显示,不过为了不能让玩家觉得是死机了,加载场景会切换成过场片段或者过场画面例如展示一下游戏技巧等给玩家知道游戏没有死机,同样道理,onPause()一样是执行过场的动作,官方推荐调用这个方法时让UI保持活动,同时方法内要执行的操作尽可能轻量化,别做太多的耗时操作。

  5. onStop()
    当Activity对用户完全不可见时调用,例如另一个Activity在栈顶,完全覆盖了当前的Activity,或者该Activity正在被销毁。该回调方法和onPause()方法的主要区别在于,如果启动的新Activity是一个对话框式的activity,那么,onPause()方法会得到执行,而onStop()方法并不会执行。

  6. onDestory()
      这个回调方法在Activity被销毁之前调用。

  7. onRestart()
    在Activity停止之后,再次启动之前调用,始终跟随onStart()

3.2 生命周期回调方法示例

我们在每个回调方法里添加log监控每个回调方法的运行情况,代码如下,然后再来执行各种操作看Activity生命周期。

package com.test.activitydemo;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    Button bclick;
    TextView tv;
    String TAG="Activity Life";

    //
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bclick=findViewById(R.id.button);
        tv=findViewById(R.id.textView);
        tv.setText("活动状态");

        Log.e(TAG, "start onCreate");

        bclick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv.setText("可见状态");
                AlertDialog alertDialog1 = new AlertDialog.Builder(MainActivity.this)
                        .setTitle("弹框")//标题
                        .setMessage("弹框变成前景,验证onPaus是否执行")//内容
                        .setIcon(R.mipmap.ic_launcher)//图标
                        .create();
                alertDialog1.show();

            }
        });
    }

    // 当活动对用户可见时调用,Activity可见生命周期的开始。
    @Override
    protected void onStart()
    {
        super.onStart();
        Log.e(TAG, "start onStart");
    }

    // 在Activity停止之后,再次启动之前调用,其后是onStart(),也就是可见生命周期开始.
    @Override
    protected void onRestart()
    {
        super.onRestart();
        Log.e(TAG, "start onRestart");
    }

    // 前台生命周期开始
    @Override
    protected void onResume()
    {
        super.onResume();
        Log.e(TAG, "start onResume");

    }

    // 前台生命周期结束前调用
    @Override
    protected void onPause()
    {
        super.onPause();
        Log.e(TAG, "start onPause");
    }

    // 可见生命周期结束即将结束前调用
    @Override
    protected void onStop()
    {
        super.onStop();
        Log.e(TAG, "start onStop");
    }

    // 销毁前调用.
    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        Log.e(TAG, "start onDestroy");
    }
}

  1. 首先是启动demo,我们看到Activity逐一调用了onCreate(),onStart(),onResume(),然后进入Activity界面,对应Activity整个生命周期的前三个回调函数;
    在这里插入图片描述
  2. 然后我们点击按钮,在Activity上弹个框,看看是否回调onPause(),结束前台生命周期。我们看到,有弹框在Activity之上,但并没有回调onPause(),也就是说,Activity没有结束前台生命周期,当前Activity还是在栈顶,不是说有弹框部分覆盖Activity,Activity失去焦点后结束前台生命周期吗,这是怎么回事?这是因为创建的AlertDialog对话框有一个context类型的参数,该参数表示AlertDialog是在Activity的上下文创建的,表示弹出的AlertDialog仍属于当前Activity,Activity没退居幕后,所以不会执行onPause().那怎样的弹框才能进入onPause()呢?只能是伪装成弹框的Activity了。为什么需要是弹框式Activity,普通的Activity是否可行?普通的Activity完全覆盖了当前的Activity,当前Activity不可见了,弹框式Activity没有完全覆盖当前Activity,Activity结束前台生命周期,但仍然可见。
    在这里插入图片描述
    将普通Activity变成弹框式,只需要修改主题(Theme)成弹框主题即可,弹框主题在style.xml里设置,代码如下
<style name="dialogstyle">
    <!--设置dialog的背景-->
    <item name="android:windowBackground">@android:color/transparent</item>
    <!--设置Dialog的windowFrame框为无-->
    <item name="android:windowFrame">@null</item>
    <!--设置无标题-->
    <item name="android:windowNoTitle">true</item>
    <!--是否浮现在activity之上-->
    <item name="android:windowIsFloating">true</item>
    <!--是否半透明-->
    <item name="android:windowIsTranslucent">true</item>
    <!--设置窗口内容不覆盖-->
    <item name="android:windowContentOverlay">@null</item>
    <!--设置动画,在这里使用让它继承系统的Animation.Dialog-->
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <!--背景是否模糊显示-->
    <item name="android:backgroundDimEnabled">true</item>
</style>

然后在AndroidManifest.xml里修改Activity主题

      <activity
            android:name=".AlertDialogActiviy"
            android:theme="@style/dialogstyle" />

最后在代码中实现跳转

Intent intent = new Intent(MainActivity.this, AlertDialogActiviy.class);
                startActivity(intent);
                

这样我们打开Activity弹框时,原Activity仍可见,我们看logcat,可看到已经调用onPause(),表示结束了前台生命周期。我们点导航栏的返回键,回到原Activity界面,则回调onResume方法,重新进入前台生命周期。
在这里插入图片描述
在这里插入图片描述
3. 现在来看下可见生命周期的示例。这个比较简单,只要调用另外一个Activity或者回调桌面(桌面其实也是一个Activity)即可,只要让我们的Activity不可见就行。为了方便(偷懒),我用回到桌面来验证,验证的logcat截图如下,可以看到,首先回调onPause(),随着Activity消失,桌面完全显示,最后回调onStop(),正式结束可见生命周期。
在这里插入图片描述
然后我们再从桌面回到Activity,logcat截图如下,首先回调onRestart(),宣布复活,然后是onStart(),进入可见生命周期,最后调用onResume(),进入前台生命周期。
在这里插入图片描述
4. 最后看销毁Activity的回调方法,操作方法很简单,杀掉Activity即可调用,不再赘述。
在这里插入图片描述

活动的生命周期
Massimo__JAVA的博客
06-04 1017
掌握活动的生命周期对任何Android开发者来说都非常重要,当你深人理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面发挥得游刃有余。你的应用程序将会拥有更好的用户体验。Android 中的活动是可以层叠的。我们每启动一个新的活动,就会覆盖在原活动之上,然后点击Back键会销毁最上面的活动,下面的一个活动就会重新显示出来。其实Android是使用任务( Task )来管理活动的,一个任务就是一组存 放在栈里的活动的集合,这个栈也被称作返回栈( Back Stack )。栈是一
Activity生命周期与跳转
qq_52230065的博客
10-19 2924
  实现以recyclerView消息列表的单项消息向详细界面的跳转,以及从消息详细界面获取另一个Activity的回传值;以下介绍Activity生命周期 Activity生命周期主要由七个方法组成  onCreate() 方法在首次创建 Activity 时调用,在 onCreate() 方法中通过调用 setContentView() 方法初始化当前页面布局,接着执行调用 onStart() 方法;  onStart() 在 Activity 即将可见时调用,此时用户不能交互,接着执行 onResum
Android Activity 生命周期验证
mypyg的专栏
11-22 171
Android Activity 生命活动周期再验证 Activity的launchmode为默认值。 1.桌面图标启动Ap,按Back键返回: onCreate() onStart() onResume() 【Back键按下】 onPause() onStop() onDestroy() 2.长按Home按键,从最近程序中点击图标进入: 与情况1相同。 ...
2-activity:Activity生命周期验证
05-17
测试2 实验二活动的生命周期 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // The activity is being created. } @Override protected void onStart() { super.onStart(); // The activity is about to become visible. } @Override protected void onResume() { super.onResume(); // The activity has become visi
Activity生命周期
m0_63526467的博客
08-22 879
Activity生命周期
Activity生命周期验证
TenFigures的博客
06-15 1450
Activity作为Android四大组件之一,其生命周期Android开发最基础也是最易混淆的知识,为了更为清晰辨别Activity生命周期方法运行过程,简单验证如下:package woodknife.com.androidbase; import android.app.Activity; import android.os.Bundle; import android.util.Log...
Maven入门指南⑦:Maven的生命周期和插件
weixin_30828379的博客
07-01 157
  一个完整的项目构建过程通常包括清理、编译、测试、打包、集成测试、验证、部署等步骤,Maven从中抽取了一套完善的、易扩展的生命周期。Maven的生命周期是抽象的,其中的具体任务都交由插件来完成。Maven为大多数构建任务编写并绑定了默认的插件,如针对编译的插件:maven-compiler-plugin。用户也可自行配置或编写插件。 1 . 三套生命周期   Maven定义了三套生命周期:...
2020-实验1-Activity生命周期验证(已完成)1
08-08
Activity生命周期的理解和管理对于编写高效、响应式的Android应用至关重要。本实验旨在深入探索Activity生命周期,并通过实践来理解各个阶段的工作流程以及它们之间的转换。 首先,我们来看一下Activity的生命...
Activity生命周期实例讲解
09-04
Activity生命周期包括7个主要阶段,分别是: 1. `onCreate()`:当Activity首次创建时调用,用于初始化界面布局、数据和一些基本设置。在这个方法里,通常会设置视图、加载数据和设置监听器。 2. `onStart()`:当...
Android Activity生命周期,源代码下载
07-27
Android Activity生命周期演示源码,从第一个Activity到第二个ActivityAndroid Activity形象的说就是一个容器,在里面放置各种控件(按钮,文本,复选框等),就形成了软件的界面~ Activity是可见的。
一文彻底搞懂 Activity生命周期
嘴巴吃糖了
06-20 412
作为Android开发人,如果说连Activity生命周期都没搞懂,会走非常多的弯路,所以这篇文章我就对Activity生命周期生命周期进行一个简单的总结。首先,我们创建一个My_A_Activity,并且打印它的各个生命周期方法。 现在,我们开始来走一遍单个Activity生命周期吧!启动My_A_Activity,日志打印如下: 如果按下home键,日志打印如下: 如果此时再次点击图标进入,日志打印如下: 此时,进行横竖屏切换,日志打印如下: 此时,退出app,日志打印如下: 以上流程还是很简单的,
(一)Activity生命周期
Arrizo5的博客
02-08 515
Activity生命周期总结
帅气的JOJO
12-12 332
本文总结一下本人在学习Activity时的知识和想法
验证Vue生命周期执行顺序
老婆就是要败家
08-11 318
Vue实例从开始创建 、初始化数据、 编译模板 、挂载Dom和渲染、卸载等一系列过程 , 这些就是Vue的生命周期 Vue的生命周期里边有八个生命周期钩子函数分别是 beforeCreate()创建前 created() 创建 beforeMount() 挂载前 mounted() 挂载 beforeupdate()更改前 updated() 更改 beforDestory()销毁前 destroyed() 销毁 代码验证部分 : 我特意将创建方法放在最后边 , 依然是最先
请设计实验验证Activity生命周期
最新发布
10-18
设计一个实验来验证Android Activity生命周期通常涉及创建一个简单的应用程序,然后通过打印日志或者使用Debug工具观察Activity的状态变化。以下是步骤: 1. **创建新项目**: 使用Android Studio创建一个新的Empty Activity项目。 2. **添加Logcat声明**: 在关键的生命周期方法上添加`Log.d()`调用,如onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()等。例如: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("ActivityLifecycle", "onCreate"); } @Override protected void onStart() { super.onStart(); Log.d("ActivityLifecycle", "onStart"); } // 添加其他方法对应的日志打印 ``` 3. **运行并模拟操作**: - 启动应用:在手机或模拟器上点击启动Activity,会在Logcat中看到onCreate()被触发。 - 突然切换到其他应用:这时会在Logcat中看到onPause()和onStop()。 - 再次返回到这个Activity:会看到onResume()、onStart()。 - 关闭应用或按Home键:将看到onSaveInstanceState()(如果有的话),然后是onPause()、onStop()和finally onDestroy()。 4. **分析日志**: 查看每个方法何时被调用,以及在哪些事件发生后,这有助于理解Activity在整个生命周期中的实际行为。
写文章

热门文章

  • Schnorr身份识别方案 3536
  • Android AIDL使用介绍(1)基本使用 2765
  • Android Context初探 2691
  • 零知识证明介绍 2598
  • Android回调的简单理解 2035

分类专栏

  • 小白Android开发笔记 16篇
  • 图像处理 1篇
  • Python 1篇

最新评论

  • Android AIDL使用介绍(2)自定义数据类型的传递

    wa_520: 很多容易的地方都写得很详细

  • Android AIDL使用介绍(2)自定义数据类型的传递

    wa_520: 很多容易的地方都写得很详细

  • Android回调的简单理解

    m0_60387895: 接口中的void方法应该更换String的

  • 零知识证明介绍

    象屁火箭: RSA?

  • Android消息机制基本原理和使用

    象屁火箭: 写的超好

大家在看

  • BUUCTF:数据包中的线索
  • 多变量互信息——时空特征捕获
  • IDM下载器 (Internet Download Manager) v6.42.2 中文免激活绿色版 1764
  • 彻底搞懂ScheduledThreadPoolExecutor
  • Win10系统安装docker操作步骤 174

最新文章

  • Android广播的学习和使用
  • Android权限申请的学习实践
  • Android消息机制源码,一个比较直观的简析
2020年16篇
2019年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家海淀玻璃钢人物雕塑闽侯玻璃钢雕塑厂家温州玻璃钢卡通雕塑厂家北京商场美陈怎么做方案玻璃钢人物雕塑怎么合作广东景观玻璃钢雕塑销售电话玻璃钢雕塑 造型南通人物玻璃钢雕塑定做北京玻璃钢玻璃钢雕塑公司玻璃钢仿铜雕塑生产商庆阳城市玻璃钢雕塑多少钱玻璃钢小军娃雕塑仿铜玻璃钢雕塑出售北京仿铜玻璃钢雕塑安装甘南城市玻璃钢雕塑安装福建定制玻璃钢雕塑图片成品玻璃钢雕塑摆件制造大庆玻璃钢雕塑源头厂家大兴区商场美陈公司报价海口玻璃钢广场雕塑设计多少钱卡通雕塑玻璃钢有哪些公司河南石雕雕塑玻璃钢河南常用商场美陈供应商太原阳江玻璃钢卡通雕塑玻璃钢雕塑打磨室怎么玻璃钢花盆雕塑多少钱一平米深圳中庭商场美陈圆形玻璃钢花盆模具广州玻璃钢花盆设计西宁仿真人物玻璃钢雕塑制作香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化