美文网首页
基础篇一:Activity与Activity使用分析

基础篇一:Activity与Activity使用分析

作者: 简单的救赎 | 来源:发表于2016-12-16 09:45 被阅读9次

    1 前言

    Activity是四大组件中最常用组件,了解Activity,是开发高质量的应用的必须条件。下面有四个问题来学习Activity

      Activity的形态 ? 
    
      Activity的生命周期?
    
      Activity状态保存于恢复?
    
      Activity的四种启动模式对比?
    

    2 Activity的起源

    Activity是与用户交互的第一接口,它提供的是一个用户完成指令的窗口。当我们创建Activity之后,通过调用setContentView(View)方法来给>该Activity指定一个显示的界面,并且以此为基础提供给用户交互的接口。系统采用Activity栈的方式来管理Activiity。

    3 Activity的四大形态

    Active/Running

    这时候,Activity处于Activity栈的最顶层,是可见,并且与用户进行交互。

    Paused

    当Activity失去焦点,被一个新的非全屏的Activity或者是一个透明的Activity放置在栈顶时,Activity就转化成Paused形态。但它只是失去了与用 >户交互的能力,所有的组昂太爱信息,成员变量都还保持着,只有在系统内存极低的情况下,才会被系统回收掉。

    Stoped

    如果一个Activity被另一个Activity完全覆盖,那么Activity就会进入Stopped形态,此时它不在可见,但是依然保持了所有的状态信息和成员变
    量。

    Killed

    当Activity被锡系统回收掉或者是Activity从来没有创建过,Activity就处于Killed形态。

    3 Activity的生命周期

    Activity生命周期Activity生命周期

    在此图中的多个Activity生命周期中,只有三个状态是稳定的,而其他状态都是过度状态:

    Resumed(可见,可与用户交互)

    这个状态就是前面说的Active/Running形态,此时Activity处于Activity栈顶,处理用户的交互。

    Paused (部分可见,不可与用户交互)

    当Activity的一部分被遮挡的时候进入这个状态,这个状态下的Activity不会接受用户输入。

    Stopped

    当Activity完全被覆盖时进入这个状态,此时Activity不可见,仅在后台运行

    启动正常流程
    onCreate() 创建基本的UI元素
    onStart() 调用Activity的资源
    onResume() 调用系统资源,显示

    销毁正常流程
    onPaused() 释放系统资源
    onStop() 清除Activity的资源,避免浪费
    onDestory() 销毁Activity

    4 Activity状态保存于恢复

    官方版重新创建 Activity

    当Activity的onSaveInstanceState调用的时候,Activity会自动收集View层级中每个View的状态。请注意只有在内部实现了View的保存/恢复状态方法的View才会被收集到。一旦onRestoreInstanceState方法被调用,Activity会把收集的数据发送回给View结构树中具有相同android:id配置的View。

    虽然View的状态被自动保存了,但是Activity的成员变量并没有。他们会随着Activity一并销毁。你需要通过onSaveInstanceState和onRestoreInstanceState手动保存并恢复这些变量。

    public class MainActivity extends AppCompatActivity {
    // These variable are destroyed along with Activity
    private int someVarA;
    private String someVarB;
    @Override
    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("someVarA", someVarA);
    outState.putString("someVarB", someVarB);
    }
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    someVarA = savedInstanceState.getInt("someVarA");
    someVarB = savedInstanceState.getString("someVarB");}’
    ‘}`

    5 Activity的启动模式对比

    AndroidManifest启动模式:

    standard

    默认的启动模式,标准模式,每次都会创建新的实例。 两次创建同一个Activity,获得两个不同的实例。

    singleTop

    系统会判断当前任务栈的顶部Activity是不是要启动的Activity。如果是则引用当前Activity,如果不是则创建新的Activity。适用于接收到消息后显示的界面,例如QQ接收到消息,如果来10条消息,不能一次弹出10个Activity。

    singleTask

    情况一,在同一个App的Activity栈中启动时,如果存在,这把在栈中此Activity以上的Activity都销毁,把其置于栈顶;如果不存在,则置其于栈顶。
    PS:主Activity使用此模式,重载onNewIntent() 中finish(),可用于退出应用程序。

    情况二,不同的app或两个栈
    会把被调用的栈的所有Activity置于当前栈的栈顶,如何调用Activity以上有其他Activity,则销毁。

    singleInstance

    类似于浏览器的启动模式,应用A与应用B分别启动singleInstance的Activity则两者得到的是同一个,共享实例,而且任务栈中只能存在一个该Activity。

    Intent Flag启动模式:

    Intent.FLAG_ACTIVITY_NEW_TASK
    standard

    Intent.FLAG_ACTIVITY_SINGLE_TOP
    singleTop

    Intent.FLAG_ACTIVITY_CLEAR_TOP
    singleTask

    Intent.FLAG_ACTIVITY_NO_HISTORY
    Activity A B C A启动B为Intent.FLAG_ACTIVITY_NO_HISTORY,B启动C,则任务栈中为AC,没有B。

    相关文章

      网友评论

          本文标题:基础篇一:Activity与Activity使用分析

          本文链接:https://www.haomeiwen.com/subject/lxhnmttx.html