Android备忘录 -- 活动生命周期

1.返回栈

    首先,Android是用任务(Task)来管理活动的。一个任务就是一组存放在栈里的活动的集合,这个栈就是返回栈(Back Stack)。栈是一种后进先出的数据结构。

    简单来说,启动一个活动,它就会在返回栈入栈,并处于栈顶。而当我们调用点击Back按键或调用finish()方法销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶。系统默认显示处于栈顶的活动给用户使用。

                                          活动栈结构                

                                                 图1 返回栈结构 

                  返回栈管理活动出入栈

                                                                     图2 返回栈管理活动出入栈

2.活动状态

    每个活动会有4中状态:

    2.1 运行状态

        活动位于返回栈的栈顶,系统最不愿意回收的活动状态。

    2.2 暂停状态

        活动不再处于栈顶,但仍然可见,如对话框式的活动。只有内存极低时,系统才会考虑去回收这种状态的活动。

    2.3 停止状态

        活动不再处于栈顶,且完全不可见。系统仍然为活动保持相应的状态和成员变量。当其他程序需要内存时,有可能会被系统回收。

    2.4 销毁状态

        活动从返回栈中移除后。系统最倾向于回收这种状态的活动。

3.活动的生存期

    Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节。

    3.1 onCreate()

        活动第一次被创建时调用,完成活动的初始化操作。

    3.2 onStart()

        活动由不可见变为可见时调用。对资源进行加载

    3.3 onResume()

        活动准备好和用户进行交互时调用。此时活动处于返回栈的栈顶,处于运行状态。
        如 打开动画,初始化只有activity获取了焦点后才需要使用的组件)。

    3.4 onPause()

        准备去启动或者恢复另一个活动时调用。
        释放消耗CPU的资源,保存一些关键数据,但执行速度要快。
        如:结束占用CPU的动画或者其他正在运行任务(如音乐播放器、视频播放器等各种播放器)。
                自动化保存 -- 提交一些未保存的持久性数据,但是只有在用户离开的时候希望这些改变被保存的时候(如写一封Email)。
                释放系统资源,就像广播接收者,对传感器的操纵(就像GPS),或者在acitivity被pause之后和用户不需要的时候,任何可能影响你电池寿命的资源。

    3.5 onStop()

        活动完全不可见时调用。对资源进行释放

        注:若新启动的活动是 对话框式的活动,onPause()方法会得到执行,而onStop()方法不会执行。

                onPause()是失去焦点, onStop()是不可见。

    3.6 onDestroy()

        活动被销毁之前调用。之后状态变为销毁状态。
        此时是完全释放资源,不再重用,而onStop()释放的资源可能再次被重用。

    3.7 onRestart()

        活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

    3.8 3种生存期

         以上七个方法中除了onRestart()方法,其他都是两两相对的,从而可将活动分为3种生存期。

              3.8.1 完整生存期:onCreate()和onDestroy()方法之间经历的。

              3.8.2 可见生存期:onStart()和onStop()方法之间经历的。对用户总是可见的,即便有可能无法和用户进行交互。

              3.8.3 前台生存期:onResume()和onPause()方法之间经历的。活动处于运行状态,且可以和用户进行交互。

        活动生命周期示意图如下

    活动生命周期示意图

4.活动防回收

    Activity类中提供了onSaveInstanceState()回调方法,在活动被回收前调用,可通过它解决活动被回收时临时数据得不到保存的问题。

    onSaveInstanceState()方法携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,如putString()方法保存字符串,putInt()方法保存整型数据,以此类推。每个保存方法需要存入两个参数,第一个参数是键,第二个参数是值即要保存的内容。

    例子代码如下

@Override
protected void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    String tempDate = "Something to save";
    outState.putString("data_key", tempDate);
}
    数据保存下来后,在onCreate()方法中恢复数据,关键在于方法的参数Bundle。例子代码如下

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState != null){
        String tempDate = savedInstanceState.getString("date_key");
    }
}


本文摘简自: 第一行代码 一书



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值