zoukankan      html  css  js  c++  java
  • Activity的生命周期和启动模式


    - **Activity的生命周期**
    activity的生命周期很简单,盗取官网的一个经典的图

    上面的这张图基本上每一个Android的开发者都知道,其中只有三个状态是常态,其余的都是过度状态。 这个三个状态是onResume(此时的的activity位于任务栈的栈顶,可以和用户进行交互), onPasue(此时的状态是是activity的被遮住了一部分,比如说弹出了一个dailog,但是不可以和用户进行交互), onStop(此时的状态已经被完全覆盖,用户看不到,仅在后台运行)

    1. Activity的启动与销毁过程.
    当你调用了startActivity,系统立刻调用onCreate方法, 接着调用onStart()方法,然后继续调用onResume方法,停留在活动的状态,这个时候是可以响应交互的。当此activity部分不可见的时候,就会调用onPause()方法,进入暂停状态,当activity完全不可见的时候就会调用onStop()方法,此时的activity的不会在栈顶,对于用户来说完全不可见,并当系统资源紧张的时候会回收此activity,并调用onDestroy()方法。 如果你你是手动的返回或者调用finish()方法,系统就会从pasue状态一直调用到ondestroy
    2. onSaveInstanceState() 和onRestoreInstanceState()
    如果系统长期处于stop状态,并系统资源紧张的时候,系统会回收资源(你的activity),而此时系统为了补偿你会调用onRestoreInstanceState(Bundle savedInstanceState),这个方法中有一个bundle对象, 你可以添加键值对存入bundle对象,用来保存你需要的数据。 当你需要重新创建activity的时候,保存的Bundle对象会传递到onCreate 和onRestoreInstanceState这个两个方法中,所以你可以从这两个方法中的任意一个获取你保存的数据,用来恢复你需要的某些状态。onRetoreInstanceState()在onSave()方法之后调用


    - **Activity的启动模式**
    一个Android应用程序会有多个activity用来显示各个界面,activity之间用intent进行连接,Android系统用栈这种先进后出的结构来保存activity。当一个APP启动的时候,如果当前的环境中不存在改APP的任务栈,系统会创建一个任务栈,此后这个APP所启动的activity都会存入到这个栈中,这个栈也被称为一个Task。 值得注意的是一个Task中activity可能来自不同的APP,同一个APP中的activity也可能不在一个Task中。根据activity在栈中的位置来决定activity的状态。 当启动一个activity的时候,存入Task,位于栈顶处于活动状态,启动他的activity的如果没有调用finsh()的话依然在栈中,栈顶的activity按了返回或者调用了finish的话,栈顶的activity就会销毁并移除,下面的activity又重现了。当然系统不可能总是这么简单,所以设置了一些启动模式来改变这种正常的状态,就是在AndroidMainfest文件activity的属性android:lanuncheMode来设置。
    一共有四种不同的启动模式 standard, singleTop, singleTask,singleInstance

    1. standard: 默认启动模式。 这中启动模式每次创建都会创建新的实例存入栈中,即使栈顶已经是你要创建的activity也会在创建一个放入栈顶,所以你必须回退两次才能退出。
    2. singletop。 如果是这种模式的创建的activity,系统会先判断当前任务栈的栈顶是不是该activity,如果是改activity的话,系统不创建直接饮用这个activity,如果不黄是则创建。
    3. singleTask。 singleTask域singleTop类似,只不过singleTop检测的是栈顶,而singleTask检测的是整个任务栈。值得注意的是如果栈中有这个activity,把activity移到栈顶的时候,这个activity之上的所有activity都会出栈被销毁,当然这里指的是同一个APP中启动这个activity,如果不同的APP来启动的话,那么会创建一个新的任务栈。 有一点需要注意的是如果启动模式为singleTask的activity已经在后台的一个任务栈中了,那么启动后,后台的任务栈将会切换到前台。 需要注意的是如果此模式下又设置了android:taskAffinity="栈名",栈名不和你APP的包名相同的话,会单独创建一个栈来存放次activity或者存放到名字相同的任务栈中
    4. singleInstanace: 单例模式。 这是一种加强的singleTask模式,这种启动模式的activity会位于一个单独的任务栈中。
    5. **需要注意的是 singleTop, singleTask,singleInstance 这个三种启动模式第二次启动的时候会调用oonNewIntent(Intent intent)这个方法,这个方法中有一个参数intent用来接收启动的时候传递过来的参数**
    6. 以上只是在任务文件中配置,方然也可以在程序中指定(intent.setFlags()):
    - Intent.FLAG_ACTIVITY_NEW_TASK 使用一个新的任务栈来存放activity应该和singleInstance类似
    - Intent.FLAG_ACTIVITY_SINGLE_TOP 相当于singleTop
    - Intent.FLAG_ACTIVITY_CLEAR_TOP 清空栈顶,和singleTask相同
    -

  • 相关阅读:
    Android 内存分析工具 MAT(Memory Analyzer Tool)
    google教程
    webView中支持input的file的选择和alert弹出
    记录一些容易忘记的属性 -- UIImageView
    记录一些容易忘记的属性 -- UIGestureRecognize手势
    使用苹果提供的汉字转拼音方法
    关于Xcode调试的帖子,感觉不错,转来看看
    记录一些容易忘记的属性 -- UIKeyboard
    记录一些容易忘记的属性 -- NSTimer
    记录一些容易忘记的属性 -- UIView
  • 原文地址:https://www.cnblogs.com/xlurenjia/p/7652703.html
Copyright © 2011-2022 走看看