关于安卓Activity生命周期的讲解

 Activity的生命周期

                To live is to function,that is all there is in living.

      任何Activity的生命周期都是给定的,Activity的生命周期设置的长短,关乎了整个程序的运行效果,一个良好的程序开发者对于Activity生命周期的把握绝对是极其准确的,所谓的生命周期指的是:一个Activity的开始时间,指导其结束的时间

Activity生命周期分为六个阶段:

            1、created:Activity开始被创建

            2、started:Activity开始启动

            3、resumed:Activity显示在界面

            4、paused:Activity被停止但是任然看得见,只是不能获取到焦点

            5、stoped:Activity被结束消失在界面,不可见

            6、destoryed:Activity被销毁,再回退栈中也找不到了,如果需要该activity需要重新创建

其中,详细流程如下


接下来看代码,我们在Activity里面重写这些方法,然后用log打印:

      private static final String TAG = "---->>>";

      @Override
      protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         Log.i(TAG, "onCreate: ");
      }


      @Override
      protected void onStart() {
      super.onStart();
      Log.i(TAG, "onStart: ");
     }

      @Override
      protected void onResume() {
      super.onResume();
      Log.i(TAG, "onResume: ");
    }

     @Override
     protected void onPause() {
     super.onPause();
     Log.i(TAG, "onPause: ");
   }

     @Override
     protected void onStop() {
      super.onStop();
     Log.i(TAG, "onStop: ");
   }

     @Override
     protected void onDestroy() {
     super.onDestroy();
     Log.i(TAG, "onDestroy: ");
    }

    @Override
    protected void onRestart() {
    super.onRestart();
    Log.i(TAG, "onRestart: ");
  }
然后看logcat打印出什么:


可以发现在activity从无到有,出现在屏幕上,我们可见是会经历如下方法:

  onCreate(加载视图)——>onStart(从后台调到前台)——>onResume(出现在屏幕上)

那么什么叫从后台调到前台尼?

我们将测试ActivityA跳转到ActivityB,再有ActivityB跳转至A,在打开会发现logcat会打印如下:


此时的activity都是标准模式

这个时候我们就需要谈一下回退栈了,回退栈可以看作一个堆栈,每当创建一个标准的Activity都会放入栈中,如果这个activity没有被销毁,并且没有获取焦点,这是便是它便后台,而前台就是正在显示的activity。

那么如果activity退出会执行什么方法尼,我们结合看logcat打印


可以发现activity从可见变为消失,执行了如下方法:

onPause()——>onStop(  )——>onDestroy(  )到此activity彻底没有了

那么如果Activity退出或者意外关闭会发生什么尼?


这时候由于activity已经消失了,并且退出了应用,所以它不仅会执行OnStop()还会执行OnDestroy(),销毁该Activity。

那么如果activity在可见的情况下,将切换其他应用会发生什么尼?


我们拭目以待


可以发现这个时候activity也彻底被干掉了

那么如果我们在activity可见的情况下将手机横竖切换又会发生什么尼?


可以发现,这个时候的activity销毁了,并且重新创建一个新的activity,那么如果之前的activity还有数据尼,如何保存这部分数据尼,这时候我们需要掌握一个新的技术,她的名字叫做“现场保护”,怎么做尼?如下:

   

    /**
     * activity意外退出的时候会执行此方法
     * 但是按返回键,属于正常逻辑行为
     * onStop()与onDestroy()之间
     * @param outState
     *
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("data","good good study");
        Log.i(TAG, "onSaveInstanceState: ");

    }

    /**
     *activity创建时调用
     * 运行与onStart()与onResume()之间
     * activity只要运行便会执行
     * @param savedInstanceState
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String data = savedInstanceState.getString("data");
        Log.i(TAG, "onRestoreInstanceState: data =  "+data);
    }
}
具体是什么我就不说了,代码注释的很详细,若仍有疑问请留言,我们再一次的执行横竖屏切换,接下来我们看logcat打印了什么:


成功的打印除了good good study,小伙伴们是不是学到了什么

总结:

     在执行 onPause()方法时,界面可以看见,但是不能做任何操作,可以通过onResume()来再次得到界面,此时可以操作

     在执行onStop()方法时,界面消失,完全不可见,但是可以通过onRestart()——onStart()——onResume()来将Activity显示在界面

      用户在将竖屏切换至横屏的时候,其Activity的活动如下:onPause()—— onStop()—— onDestroy()—— onCreate()—— onStart( ) —— onResume()

    如果不做现场保护,横竖屏切换过程中,会导致数据丢失,因为它开启的是一个新的Activity

     此外,需要做优化的朋友有没有想过,在activity销毁的时候动动手脚尼   ;做动画的时候为了让系统识别自定义属性,在oncreate()的set Content View()这个里面动动手脚尼(Fratory加载视图)

此为个人陋见,若有误,还望读者海涵。配以官方图片,便于精确理解

 

  
一家之言,有误望扶正,多谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值