Android之Activity生命周期探索

Task & Back Stack

        Android中的Activity全都归属于Task管理,Task是多个Activity的集合,这些Activity按照启动顺序排队存入一个栈(Back Stack)。
        Android默认会为每个App维持一个Task来存放该App所有的Activity,默认Task的name为该App的packagename。
        可以在AndroidManifest.xml中申明Activity的taskAffinity属性来自定义Task,但不建议使用,因为如果其他App也申请了相同的Task,有可能启动到我们的Activity带来安全问题。



Activity生命周期回调方法

在这里插入图片描述

        onCreate():在Activity第一次创建的时候调用,在这个回调方法中完成Activity的初始化操作,比如加载布局,初始化控件,绑定监听事件等;
        onStart():在Activity由不可见到可见的时候调用;
        onResume():在Activity准备好和用户交互的时候调用,此时的Activity一定唯一Back Stack栈顶,并且处于running运行状态;
        onPause():在系统准备去启动或者恢复另一个Activity的时候调用;
        onStop():在Activity完全不可见的时候调用;
        onDestroy():在Activity被销毁之前调用,之后Activity的状态将变为销毁状态;
        onRestart():在Activity由停止状态变为运行状态之前调用,Activity重启时调用;



代码下Activity生命周期展示

//创建到销毁的生命周期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onStop() ——> onDestroy()

//从启动到后台,再到前台的生命周期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onStop() ——> onRestart() ——> onStart() ——> onResume()

//从启动到失去焦点,再到获取到焦点的生命周期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onResume()

//停止状态(Stopped)Activity被完全遮挡,但保留所有状态和成员信息



Activity的内部调用过程

        打开一个新的Activity实例的时候系统依次调用onCreate()、onStart()、onResume()然后开始running运行状态;

调用
调用
调用
to
Activity
onCreate
onStart
onResume
running状态

running的时候Activity被覆盖系统调用onPause()方法,接下来它有三个选择;
        1.用户返回到该Activity就调用onResume()方法重新running运行状态;

被覆盖
返回Activity
to
running
onPause
onResume
running状态

        2.用户回到桌面或者打开其他Activity就会调用onStop()进入停止状态;

被覆盖
回到桌面或打开其他Activity
to
running
onPause
onStop
stop状态

        3.系统内存不足或者拥有更高权限的应用需要内存,该Activity的进程可能会被系统回收,想要重新打开就必须重新创建。如果用户返回到onStop()状态Activity,系统会调用onRestart()、onStart()、onResume()然后重新running运行,在Activity结束或者被系统杀死之前会调用onDestroy()方法释放掉所有占用的资源。

被回收
重新创建
调用
调用
to
running
onStop
onRestart
onStart
onResume
running状态



Activity的四种状态

        活动状态(Active/Running)Activity处于界面最顶端,获取焦点;
        暂停状态(Paused)Activity失去焦点,但对用户可见;
        停止状态(Stopped)Activity被完全遮挡,但保留所有状态和成员信息;
        非活动状态(Killed)Activity被停止;



Activity生命周期的嵌套循环

        1.完整生存期:在onCreate()调用和onDestroy()调用之间发生;
        2.可见生存期:在onStart()调用和onStop()调用之间发生,系统会在Activity的整个生命周期内多次调用onStart()和onStop(),因为Activity可能会在显示和隐藏之间不断地来回切换;
        3.前台生存期:在onResume()调用和onPause()调用之间发生,因为这个状态可能会经常发生转换,为了避免切换迟缓引起的用户等待,这两个方法中的代码应该相当的轻量化;



Activity生命周期交互设计思想

1.多个Activity的生命周期交互

跳转
MainActivity
SecondActivity
//启动MainActivity
MainActivity:onCreate() ——> onStart() ——> onResume() 

//通过MainActivity启动SecondActivity
MainActivity:onPause()
SecondActivity:onCreate() ——> onStart() ——> onResume() 
MainActivity:onStop()

//在SecondActivity点击Back键返回MainActivity
SecondActivity:onPause()
MainActivity:onRestart() ——> onStart() ——> onResume() 
SecondActivity:onStop  ——> onDestroy()

2.为什么要先暂停当前显示的Activity?

        为什么MainActivity启动SecondActivity先使用MainActivity的onPause()方法然后再去打开SecondActivity呢?
        为什么不在SecondActivity启动完成后再调用MainActivity的onPause()方法呢?
        这样设计的原因是为了防止当MainActivity进行着一些功能的时候不对其所在的Activity进行暂停就进入下一个Activity进行操作,很可能因为功能重叠造成很糟糕的用户体验。所以我们在一个Activity进入到另外一个Activity之前要先调用前一个Activity的onPause()方法将这个Activity所有活动暂停后再去执行下一个Activity。


3.为什么要先执行要打开Activity的onCreate()、onStart()、onResume()方法?

        这个Google为我们做的一个保护的机制,假设我们在启动SecondActivity的时候出现一些异常信息被crush掉了。如果我们在第一个Activity的onPause()方法之后直接调用onStop方法,那么这个Activity就变成不可见。那么现在这个时候第一个Activity处于不可见状态,第二个Activity被crush掉了,整个应用程序就处于黑屏的状态。
        所以Google为了针对这种情况设计的是MainActivity启动SecondActivity先将MainActivity暂停onPause了后启动SecondActivity的生命周期,当SecondActivity完全启动后再调用MainActivity的onStop方法将它置于后台,那么这个时候显示的就是SecondActivity。
        Crash:因为程序或者各种原因而导致的程序意外退出,俗称"闪退";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值