zoukankan      html  css  js  c++  java
  • activity生命周期实例(不同启动模式)

    1、生命周期的几个阶段介绍:

    onCreate:

      表示activity被创建,做一些初始化工作如调用setContentView去加载界面布局资源、初始化Acitivity所需数据等。改方法中调用destroy时,其它生命周期不会由,直接进入onDestroy.

    onRestart:

      Activity从不可见变成可见状态时,onRestart就会被调用。打开一个新的activity时,onPause和onStop会被调用,回到当前Acitivity时 onRestart会被首先调用。

    onStart:

      onRestart被调用后,onStart会被调用。

    onRestoreInstanceState:

      恢复activity页面的数据,一般由 onSaveInstanceState 函数保存的数据。

    onResume:

      表示activity已经可见,并且出现在前台开始活动。onStart和onResume都表示avtivity已经可见,但是onStart活动还在后台,onResume已经显示到前台。一般可以用来开启动画/访问相机 等

    onPostCreate:

      当整个activity都起来的时候,会被调用。

    onPause:

      表示Activity正在停止,正常情况下紧接着onStop就会被调用。

    onSaveInstanceState:

      用于保存view相关的数据,但是android并不保证onPause之后一定调用该方法,有可能在onPause之前或者之后。

    onStop:

      表示activity即将停止,可以做些轻量级的回收工作

    onDestroy:

      表示activity即将被销毁,这是生命周期的最后一个回调,可以做些回收工作和最终的资源的释放。

    2、不同启动模式下的生命周期顺序

    standard模式下活动启动log

      启动页面A:

            

      跳转到B页面:

         

      返回到页面A:

        

        返回上一页面不会调用onCreate方法

    如果跳转到B,然后到C,再返回A:

            

        该模式下,onCreate方法会被重新调用

    A 启动 A (Activity堆栈中有自身的Activity)时的log如下: 输出为方法的名称 和 Activity.hashCode() 

                        

    有上述的log可以看出,每次调用 不管堆栈里面有没有自身这个Activity都会create相同的Activity

    singleTast模式下活动的启动log

      启动A页面:

          

      跳转到B页面:

             

      返回到A页面:

           

      如果跳转到B,然后到C,再返回A:

        和从B返回到A相同,在singleTast启动模式中,对于已经启动的活动不会在调用onCreate方法。

    SingleTop模式下

      A start A时,不会重新create一个Activity,因为活动栈顶存在这个Acitivity,不需要再创建

      A start B  B 再 start A时,会重新创建 这个Activity,因为栈顶已经没有这个Activity

    SingleInstance模式

     singleTask类似,不同点是singleInstance要求activity的实例不仅只有一个,并且整个task中只有一个activity实例

    启动模式的设置:

    a/ 在androidMainifiest中设置Activity的启动模式 

           <activity
                android:name=".MainActivity"
                android:launchMode="singleTask"
                android:configChanges="orientation|screenSize">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

    b/ 在Intent中设置标志位来指定Activity的启动模式

    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

    Flag的属性有四种:

    FLAG_ACTIVITY_NEW_TASK                ------- singleTask
    FLAG_ACTIVITY_CLEAR_TOP               ------- clearTop //当栈顶有其他activity时,会把他们出栈处理。 singleTask模式会 调用 onNewIntent
    FLAG_ACTIVITY_RESET_TASK_IF_NEEDED    ------- clearTop
    FLAG_ACTIVITY_SINGLE_TOP              ------- singleTop

    3、Home键、back、横竖屏切换、锁屏时Activity生命周期

      http://blog.csdn.net/tech_universe/article/details/44157095

    4、Activity 与Task千丝万缕

      task是一个具有栈结构的容器,可以放置多个Activity实例。启动一个应用,系统就会为之创建一个task,来放置根Activity;默认情况下,

    一个Activity启动另一个Activity时,两个Activity是放置在同一个task中的,后者被压入前者所在的task栈,当用户按下后退键,后者从task被弹出,

    前者又显示在幕前,特别是启动其他应用中的Activity时,两个Activity对用户来说就好像是属于同一个应用;

      这一节专门写了一篇:

    singlaTask和singleInstance模式 与 startActivityForResult不能共存:

    http://blog.csdn.net/androidhuoniao/article/details/6535042

    Activity 与 Task 联系

    http://blog.csdn.net/liuhe688/article/details/6761337/

      

  • 相关阅读:
    Caused by: com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the
    Caused by: java.lang.IllegalArgumentException: @EnableAsync annotation metadata was not injected
    jpa单向一对一关系外键映射
    jpa关联映射
    svn 插件去除已经保存的密码方法
    【前端】less学习
    【CodeForces 520E】Pluses everywhere
    费马小定理证明
    【前端】纯前端的一个‘喜欢我吗?’
    Sublime text3 插件HTML/CSS/JS prettify 格式化代码
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/6898140.html
Copyright © 2011-2022 走看看