zoukankan      html  css  js  c++  java
  • Android之Activity的生命周期

    PS:写一发关于Activity的生命周期,也算是面试的重点内容.

    学习内容:

    1.Activity的生命周期

    2.面对多种情况的时候Activity的生命周期

    3.onSaveInstanceState()方法的调用

    1.Activity的生命周期

      Activity的生命周期是Android中需要掌握的重点部分..也就此简单的介绍一下..顺便自己也捋一捋概念上的东西..

    返回栈的概念和流程图:

      Android中Activity的管理是由一个栈区进行管理的.在默认情况下,我们每次启动一个新的Activity的时候.他都会在返回栈中入栈.并且处于栈顶的位置.而我们每次在退出一个Activity的时候,或者是使用finish函数的时候.当前的Activity会进行出栈操作.那么栈顶位置就成为了前一个Activity系统总是会将栈顶位置的Activity显示给用户.

      这个流程图就是Activity的管理方式..

    Activity的相关状态

      i.运行状态

      运行状态的Activity.运行状态的Activity一般都是直接与用户进行交互的Acticity.也是处于栈顶位置的Activity.系统一般情况下是不会回收这个Activity的.

      ii.暂停状态

      暂停状态的Activity不再处于栈顶位置,但是仍然处于可见状态的时候,这个Activity也就进入了暂停状态.这种的Activity还是挺常见的.一般我们在操作一个Activity的时候.比如说系统弹出了一个新的对话框.这个对话框属于一个新的Activity.但是这个新的Activity并没有完全的覆盖住了屏幕.那么原来的那个Activity这个时候就处于了暂停状态.暂停状态的Activity系统一版状态下也是不会主动去回收的.(虽然活动暂停,但是仍然处于可见状态.如果进行了回收,会使得用户的体验性差).但是并不代表任何情况下都不会被回收.

      iii.停止状态

      停止状态的Activity.停止状态的Activity也不再处于栈顶位置.并且已经完全不再可见了.虽然系统仍然保存着相应的状态和变量.但是一旦其他应用也需要使用内存的时候,那么处于停止状态下的Activity也就会被系统自动进行回收了.

      iv.销毁状态

      一般情况下Activity在栈区中被移除的时候,Activity也就进入了销毁状态.等待系统的回收,释放资源和内存.

    Activity的生存周期

      i.onCreate()方法.

      这个方法在Activity在第一次被创建的时候进行调用.一些相关的初始化操作都在这个方法内部完成.

      ii.OnDestory()

      这个方法是与onCreate()方法是相互对应的.这个方法用于销毁Activity.释放资源.

      这两个方法之间的Activity是一个完整的生存周期

      iii.onStart()

      这个方法使得Activity由不可见状态成为可见状态.

      iv.onStop()

      与onStart()方法形成对应关系.当活动完全不可见的时候进行调用.

      这两个个方法之间的Activity是一个可见的生命周期

      v.onResume()

      这个方法表示当前的Activity已经可以与用户进行交互了.活动处于栈顶状态.

      vi.onPause()

      与onResume()方法形成对应关系.这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。(注:onPause()方法调用之后不一定会去调用onStop()方法.取决于新Activity的显示方式,在下面会做出解释).

      这两个方法之间的Activity是一个前台生存周期,也就是说当前的Activity可以与用户进行交互.

      vii.onRestart()

      这个方法的调用是当Activity从停止状态到运行状态时需要调用的方法.

      上一张流程图..

      以上就是关于Activity的生命周期的一个简单的介绍..下面来看一看相关的实例.

    2.面对多种情况下Activity的生命周期流程

     

      当MainActivity被创建的时候方法的调用过程:

    MainActivity的创建会调用的方法:
                    onCreate();                 onStart();                 onResume();

       当我们点击第一个按钮的时候,开启一个新的Activity(我们称为Activity1).当Activity1被创建的时候方法的调用过程是这样的.

      首先Activity1调用的方法如下:

    Activity1的回调方法如下:
                 onCreate();
                 onStart();
                 onResume();
    
    

       MainActivity的回调方法:

    MainActivity被Activity1覆盖之后回调方法的调用
                                onPause();
                             onStop();                

      这时MainActivity已经执行了上面的一些方法..

     当我们退出Activity1的时候.MainActivity的执行方法如下:

    当我们退出Activity1.回到MainActivity的时候方法的调用
                                onRestart();
                                onStart();
                                onResume();

      这里我们可以看到onCreate()方法就不会被执行了.这种情况的前提是我们手机的内存空间是充足的.

     我们在来看另外一种情况,比如说我们开启了一个应用,然后进入了一个Activity界面中,然后我们这时点击了home键进行了退出操作,并且没有清理手机的内存.这个时候我们去玩手机游戏,并且这个手机游戏会占用相当多的内存空间.然后我们玩完之后,如果我们再次返回前一个我们开启的那个应用的时候,他仍然会显示那个Activity的页面.那么这个时候这个Activity又执行了哪些方法呢?

     我们知道手游是相当耗费内存的.按照上面的那个流程图来看..如果其他有优先级的应用需要使用内存空间的时候,并且系统空间并不是很足的时候.就需要杀掉进程.释放那些已经不再显示的Activity.也就是处于onStop()状态的时候.因此当我们如果再次回到那个应用的Activity的界面的时候.就需要重新调用onCreate()方法对Activity进行重新创建.然后再去执行onStart().onResume()。

     我们接着看上面的另外一种情况,就是我们去点击第二个按钮的时候,弹出的对话框Activity(这里称为Activity2).我们来看看这种情况.当我们点击第二个按钮的时候Activity2的回调方法过程.

    Activity2的回调方法:
              onCreate();
              onStart();
              onResume();

      Activity2的创建仍然没有什么太大的区别..还是这三个方法的调用.那么我们来看看MainActivity的回到方法:

    MainActivity的回调方法:
                onPause();

     这里我们可以看到MainActivity只是调用了一个方法.onPause()方法.并没有去调用onStop()方法了.因为MainActivity仍然处于一个可见的状态.虽然我们启动了一个新的Activity,但是Activity2并没有完全的覆盖MainActivity,因此MainActivity只需要去调用onPause()方法.当我们点击回退的时候,MainActivity只会去调用onResume()方法了.

    3.onSaveInstanceState()方法

     前面我们已经说过,当一个活动进入到了停止状态,是有可能被系统回收的。那么如果应用中有一个活动A,用户在活动A的基础上启动了活动B,活动A就进入了停止状态,这个时候由于系统内存不足,将活动A 回收掉了,然后用户按下Back 键返回活动A,会出现什么情况呢?其实还是会正常显示活动A的,只不过这时并不会执行onRestart()方法,而是会执行活动A的onCreate()方法,因为活动A 在这种情况下会被重新创建一次。

     但是这样会导致的情况就是,这个新创建的Activity是无法保存用户上次输入的相关信息的.比如说,用户在一个文本框中输入了相关内容然后走了上面的情况.被回收之后,只能重新进行创建,那么原来用户在文本框中输入的相关内容也就不复存在了.这样就会使得用户的体验性较差.那么我们如何去记录用户上一次的操作的相关信息呢?那么就是使用onSaveInstanceState()方法了.

     我们知道Activity创建的时候会调用onCreate()方法.onCreate()方法中存在一个Bundle对象.默认情况下,这个对象的数据是空的.但是如果我们需要保存上一次用户的相关操作,一些数据信息,那么就需要使用这个对象了.

     我们只需要这样..

    @Override
    protected void onSaveInstanceState(Bundle State) {
        super.onSaveInstanceState(outState);
        String data = "需要保存的数据";
        State.putString("data_key", data);
    }

     通过这个方法将数据信息进行保存,那么恢复的时候就可以这样..

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        if (savedInstanceState != null) {
            String data = savedInstanceState.getString("data_key");
        }
        //取出数据之后,在这里进行恢复.
    }

     这样就可以通过使用这个方法保存上次用户输入的一些数据信息,如果在面对Activity需要重新创建的时候,将数据进行取出,然后重新赋给Activity这样就可以使得用户上次输入的数据会得以保存.使得Activity对用户的体验更加的良好,,

     

  • 相关阅读:
    Python3学习笔记22-文件读写
    Python3学习笔记21-实例属性和类属性
    Python3学习笔记20-获取对象信息
    Python3学习笔记19-继承和多态
    Python3学习笔记18-访问限制
    Python3学习笔记17-类与实例
    Python3学习笔记16-错误和异常
    Python3学习笔记15-迭代器与生成器
    Python3学习笔记14-迭代与列表生成式
    Python3学习笔记13-函数的参数
  • 原文地址:https://www.cnblogs.com/RGogoing/p/5405992.html
Copyright © 2011-2022 走看看