zoukankan      html  css  js  c++  java
  • Android

    本文主要參考这篇文章和任玉刚的《Android开发艺术探索》一书,谢谢两位作者!

    经典的activity生命周期图(图片来源于网络):
    Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
    7个方法简单描写叙述例如以下:
    1、onCreateActivity被创建时调用 
    2、onStart:Activity正在被启动,已经可见,但还未出如今前台。还不能和用户进行交互
    3、onResume:Activity已经可见。并出如今前台,能够和用户进行交互了
    4、onPause:Activity正在停止。能够做一些存储数据、停止动画等操作,但不能太耗时。由于onPause必须先运行完,新的Activity的onResume才会运行
    5、onStop:相同不能做太耗时的操作
    6、onDestory:Activity被销毁时调用
    7、onRestart:Activity正在被又一次启动,普通情况下。当Activity从不可见又一次变为可见时,onRestart方法就会被调用
    下边是7个方法被调用的详细场景:
    A、第一次进入:
    Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
    B、按home键、锁屏键和跳转时:
    Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
    C、当中比較特殊的是,在跳转到新的activity时,假设新的activity採用了透明主题等。那么。当前activity不会回调onStop方法:
    Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
    对上面的log显示情况做一下简单总结:
    一、onStart和onResume方法onPause和onStop方法从描写叙述上看是几乎相同的,在普通情况下,没有明显的差别,他们总是成对的出现,而且onStop方法总是接着onPause得到运行,但在有些情况下,仅仅会运行onPause而不会运行onStop。比方上边的C,而这就能够看出onPause和onStop的某些差别(onStart和onResume同理
    二、onSaveInstanceState方法的调用时机是在onStop之前。但它和onPause究竟谁先被调用,还未找到根据。

    在本文开头提到的文章中,作者的測试显示onSaveInstanceState先运行。而本文中測试结果则显示onSaveInstanceState后运行。

    三、在以上的測试中。仅仅有onSaveInstanceState方法被调用了,而onRestoreInstanceState方法却并没有被调用。採用《android开发艺术探索》一书中的话来说。系统仅仅会在Activity即将被销毁而且有机会又一次显示的情况下才会去调用onRestoreInstanceState方法。如:
    D、横竖屏切换时:
    Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
    Activity异常终止的情况下,系统会调用onSaveInstanceState方法来保存当前Activity的状态,当Activity被又一次创建之后,系统会调用onRestoreInstanceState,而且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为參数同一时候传递给onRestoreInstanceState和onCreate方法,在恢复数据时,选择onRestoreInstanceState和onCreate方法都能够,但二者是有差别的:onRestoreInstanceState方法一旦被调用,其參数(Bundle savedInstanceState)一定有值。可是,在正常启动的情况下,onCreate方法的(Bundle savedInstanceState)參数值为null,所以假设採用onCreate方法进行数据恢复。就必需要先进行推断,假设savedInstanceState不为null,则说明Activity被重建了。我们就能够取出之前保存的数据进行恢复。

    另外,从时间上来看。onRestoreInstanceState方法的调用在onStart之后。官方文档建议採用onRestoreInstanceState方法来恢复数据。

    E、假设不想让Activity在屏幕旋转的时候又一次创建,就能够给configChanges属性加入orientation这个值:
    Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..
    screenSize这个选项比較特殊,它和编译选项有关。当编译选项中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重新启动。否则会导致Activity重新启动。另外,尽管进行了相关的配置之后,Activity不重新启动了。可是,系统却调用了onConfigurationChanged方法,这时候就能够依照需求进行对应的处理了。
    F、指定横竖屏:
    能够在清单文件里设置android:screenOrientation="portrait",或是在Java文件里使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);指定为竖屏,
    在清单文件里设置android:screenOrientation="landscape"。或是在Java文件里使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);指定为横屏。
    在这两种情况下,屏幕方向发生改变时,没有不论什么方法被调用。

    G、退出Activity:
    Android - Activity 生命周期 - H , W , G , T ... .. - H , W , G , T ... ..

  • 相关阅读:
    Springboot中使用Interceptor(拦截器)
    八大排序之冒泡排序
    八大排序之快速排序
    mysql 用户的增删改与授权
    基于Java8开发接口时,处理Java8中的日期
    Springboot中Filter的使用
    正则校验日期,不考虑闰年和闰月
    正则校验时间,24小时制
    记一下mybatis中foreach循环遇到的一个小问题
    sqlserver中一条语句执行查询与更新
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7337363.html
Copyright © 2011-2022 走看看