Activity的生命周期和启动模式

在之前的开发中一直都在使用Activity但对其的了解也是比较浅显的,为了能开发出高质量的应用,对Activity的深入了解肯定是必不可少的,下面通过这篇文章记录一下对Activity的回顾以及一些新的理解。

1.Activity的生命周期方法

这里写图片描述

上图是谷歌官方文档上对Activity生命周期的介绍,简单的翻译一下(英语很菜/(ㄒoㄒ)/~~)


安卓系统采用一个Activity栈来管理开启的一些Activity,当一个新的Activity被开启时,这个新开启的Activity会被放置在activity栈的顶部成为正在运行的activity,之前的activity就会放置在activity栈的底部,并且也不会来到前台直到新的activity结束掉。

Activity的四种形态:

  • active or running
    如果一个Activity在栈的最顶层,并且处于屏幕的可见状态,可与用户进行交互。
  • paused
    如果一个Activity已经失去焦点,但是仍然可见(一个不是全屏的Activiy或者透明的Activity放置在栈顶时),这时就处于paused状态,此时只是失去了和用户交互的能力,所有的状态信息,成员变量还都保存着,它将在系统内存极低的状态下被系统回收掉。
  • stopped
    如果一个activity被另外一个Activity完全覆盖,这时就处于stopped状态,它仍然保持所有的状态和成员信息,此时它不再可见,当系统需要更多的内存的时候,此时会被系统回收。
  • killed
    当系统被activity回收掉或者Activity从来没有创建过,Activity就处于killed状态。

这里写图片描述

上面这张图应该比较熟悉吧(●’◡’●)
Activity类定义了7个回调方法,下面记录下各个方法的作用:

  • onCreate( ):在Activity第一次被创建的时候调用。可以在onCreate方法中完成Activity的初始化操作。

  • onStart( ):此方法在Activity由不可见变为可见时调用。

  • onResume( ):此方法在Activity准备好和用户进行交互的时候调用,此时的activity一定处于栈的栈顶,并且处于运行状态

  • onPause( ):此方法在系统准备启动或者恢复另一个Activity的时候调用。可以在此方法中将一些消耗cpu的资源释放掉,以及保存一些关键的数据,但是这个方法的执行一定要快,不然会影响到新的栈顶Activity的使用。

  • onStop( ):此方法在Activity完全不可见的时候调用,它和onPause( )方法的区别在于,如果启动的新的Activity是一个对话框的活动,那么onPause( )方法会得到执行,而onStop( )方法不会执行。

  • onDestroy( ):此方法在Activity销毁之前调用,之后的Activity状态变为销毁状态。

  • onRestart( ):此方法在Activity由停止状态变为运行状态时调用。


下面通过代码实例演示一下Activity的生命周期的执行流程:

这里写图片描述

(用于演示的Demo的结构)

a. 启动一个Activity并将其销毁:

这里写图片描述

生命周期方法执行的流程:

这里写图片描述
系统在启动一个Activity的时候首先会调用onCreate( )方法,然后就会调用onStart( ),接着继续调用onReasume( )以进入Resumed状态,最后就会停止在Resumed状态,完成启动。

b.开启一个新的activity时生命周期方法执行的流程 :

这里写图片描述

生命周期方法执行的流程:

这里写图片描述

由于开启了secondActivity所以FirstActivity处于不可见状态此时执行了onPause( )方法,并且开始创建secondActivity一次执行onCreate()==>onStart() ⇒ onResume()完成secondActivity的创建,然后FirstActivity执行onStop()方法。

c.从当前的Activity跳转到上一个Activity时生命周期方法执行的流程:

这里写图片描述

生命周期方法执行的流程:

这里写图片描述

d.点击home键返回主页时生命周期方法执行的流程:

这里写图片描述

生命周期方法执行的流程:

这里写图片描述

e.开启一个透明的Activity生命周期方法执行的流程:

这里写图片描述

此时FirstActivity失去了与用户进行交互的能力,转化为Paused形态。


一般来说,当系统调用onPause()和onStop()方法后的Activity
实例仍然存在与内存当中,当Activity重新回到前台的时候,之前的状态会得到保留,但是当系统内存不足时,调用过onPause()和onStop()方法后的Activity可能会被系统进行回收,此时再重新回到前台,之前的所有状态就会消失,为了避免这种情况的发生可以调用onSaveInstanceState()方法来保存之前的状态。

  /**
     * 重写此方法进行activity状态的保存
     * @param outState
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("name", "wangke");
    }

在onCreate( )方法中进行状态的获取:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this, "FirstActivity==>onCreate()", Toast.LENGTH_SHORT).show();
        Log.i("wk", "FirstActivity==>onCreate()");
        //恢复之前保存的状态
        if(savedInstanceState!=null){
            String name = (String) savedInstanceState.getString("name");
            if (name != null) {
                Log.i("wk", "获取之前保存的状态:" + name);
            }
        }
    }

需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出Activity时, 用户显然想要关闭这个Activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前.

2.Activity的启动模式

在实际的开发中,我们需要为每个Activity指定恰当的启动模式,以提用户体验。

四种启动模式:

  • standard(默认的启动模式)

  • singleTop

  • singleTask

  • singleInstance

给Activity配置启动模式:

在AndroidMainifest.xml中给 activity标签中指定如下

android:launchMode="singleTop"

下面通过实例演示一下四种启动模式的区别:
(给FirstActivity设置不同的启动模式,SecondActivity为默认的standard)

1.standard:

这里写图片描述

与上面示例对应的Activity栈:

这里写图片描述
standard启动模式每次都会创建新的实例,每次点击都会创建新的Activity覆盖在原Activity。点击back返回的时候按照后进先出进行退栈。

2.singleTop:

这里写图片描述

与上面示例对应的Activity栈:

这里写图片描述

如果栈顶的Activity为singleTop模式,如果要打开的Activity为当前栈顶的Activity此时不会重新创建新的,而是直接复用当前处于栈顶的Activity。

注:这种启动模式一般使用于接收到消息后显示的界面,例如QQ接收到消息后弹出Activity。

3.singleTask:

这里写图片描述

与上面示例对应的Activity栈:

这里写图片描述

singleTask检测整个Activity栈中是否存在当前需要启动的Activity,如果存在则将该Activity置于栈顶,并将该Activity以上的Activity都销毁。

4.singleInstance:

这里写图片描述

与上面示例对应的Activity栈:

这里写图片描述

申明为singleInstance的Activity会出现在一个新的任务栈当中,而且该任务栈中只存在这一个Activiy实例。
这种启动模式常用于需要与程序分离的界面。


除了在Mainifest中配置Activity的启动模式,还可以
通过设置Intent的Flag来设置一个Activity的启动模式。

常用的一些Flag:

  • Intent.FLAG_ACTIVITY_NEW_TASK: 使用一个新的Task来启动一个Activity,但启动的每一个Activity都将在一个新的Task中。该Flag通常使用在从Service中启动Activity的场景,由于在Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activiy栈,并创建新的Activity实例。

  • Intent.FLAG_ACTIVITY_SINGLE_TOP: 使用singleTop模式来启动一个Activity。

  • Intent.FLAG_ACTIVITY_CLEAR_TOP: 使用singleTask模式来启动一个Activity

  • Intent.FLAG_ACTIVITY_NO_HISTORY: 使用这种模式启动Activity,当该Activity启动其它Activity后,该Activity就消失了,不会保留在Activity栈中。


撒花,撒花★,°:.☆( ̄▽ ̄)/ :.°,°:.()/ :.°★ 。一个下午的时间重新梳理了下Activity相关的知识,也算对Activity有了更深一层的认识,当然……部分原因是太无聊……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值