zoukankan      html  css  js  c++  java
  • Android中Activity的启动模式

    简介

    Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance。可以在AndroidManifest.xml中通过给<activity>标签的android:launchMode来制定。

    <activity
        android:name=".SingleTopActivity"
        android:launchMode="singleTop">
    </activity>

    standard

    默认的启动方式,当启动活动时,创建并将其放在返回栈中,不管其中有没有该活动。通过adb shell dumpsys activity activities可以查看到启动两次同一个的Activity时的情形:

    Running activities (most recent first):
    TaskRecord{b1ddaad #1516 A=com.wision.www.launchmode U=0 sz=3}
    Run 2: ActivityRecord{aa96ea u0 com.wision.www.launchmode/.StandardActivity t1516}
    Run 1: ActivityRecord{8f9bf5c u0 com.wision.www.launchmode/.StandardActivity t1516}
    Run 0: ActivityRecord{82afe1b u0 com.wision.www.launchmode/.MainActivity t1516}

    注意:在lollipop之前,从其它应用程序启动的standard Activity会放在同一个Task中;在lollipop之后,当从其他程序启动standard的Activity时,会放在另外一个task中,方便切换回启动的activity

    singleTop

    如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent方法。

    Running activities (most recent first):
    TaskRecord{3a58686 #1517 A=com.wision.www.launchmode U=0 sz=2}
    Run 1: ActivityRecord{f42de2d u0 com.wision.www.launchmode/.SingleTopActivity t1517} 
    Run 0: ActivityRecord{10c724e u0 com.wision.www.launchmode/.MainActivity t1517}

    但是当该活动不在栈顶的时候并不影响继续创建:

    Running activities (most recent first):
    TaskRecord{1aa2156 #1519 A=com.wision.www.launchmode U=0 sz=4}
    Run 3: ActivityRecord{42b1119 u0 com.wision.www.launchmode/.SingleTopActivity t1519}
    Run 2: ActivityRecord{712c2eb u0 com.wision.www.launchmode/.StandardActivity t1519}
    Run 1: ActivityRecord{bc6e1ad u0 com.wision.www.launchmode/.SingleTopActivity t1519}
    Run 0: ActivityRecord{93f7493 u0 com.wision.www.launchmode/.MainActivity t1519}

    注意:该模式的Activity不管怎么启动都会和启动Activity在同一个task中

    singleTask

    用来解决重复创建的问题的,当返回栈中存在活动的实例的时候,直接使用该活动。同时

    将活动之上的所有活动统统出栈,意味着所有该活动之前入栈的活动的onDestroy都会被调用。比如,返回栈如下时启动SingleTaskActivity:

    Running activities (most recent first):
      TaskRecord{8742767 #1527 A=com.wision.www.launchmode U=0 sz=3}
        Run 2: ActivityRecord{a3fb857 u0 com.wision.www.launchmode/.MainActivity t1527}
        Run 1: ActivityRecord{60170b9 u0 com.wision.www.launchmode/.SingleTaskActivity t1527}
        Run 0: ActivityRecord{a9f9c08 u0 com.wision.www.launchmode/.MainActivity t1527}
    10-09 14:53:14.107 6827-6827/com.wision.www.launchmode D/MainActivity: onPause
    10-09 14:53:14.116 6827-6827/com.wision.www.launchmode D/SingleTaskActivity: onRestart
    10-09 14:53:14.117 6827-6827/com.wision.www.launchmode D/SingleTaskActivity: onStart
    10-09 14:53:14.117 6827-6827/com.wision.www.launchmode D/SingleTaskActivity: onResume
    10-09 14:53:14.117 6827-6827/com.wision.www.launchmode D/SingleTaskActivity: onPostResume
    10-09 14:53:14.185 6827-6890/com.wision.www.launchmode D/OpenGLRenderer: endAllStagingAnimators on 0xa0686600 (RippleDrawable) with handle 0xa0f07320
    10-09 14:53:14.456 6827-6827/com.wision.www.launchmode D/MainActivity: onStop
    10-09 14:53:14.456 6827-6827/com.wision.www.launchmode D/MainActivity: onDestroy

    注意:1,针对于singleTask属性,Activity可以放在启动Activity的同一个Task中,也可以放在新创建的一个Task中,取决于是否指定了taskAffinity。

    2, singleTask模式使用在只保留一个实例的Activity中,比如收件箱。使用时要注意,因为启动的过程中会毁掉其他的Activity。

    singleInstance

    singleInstance类似于singleTask,唯一的区别就是singleTask允许别的Activity被启动到它Task中,但是singleInstance不允许,singleInstance的Task中有且只有一个实例。当按照standard->singleInstance->standard顺序启动的时候,如果按back键退出,则直接返回到第一个standard,然后再次back才会返回到singleInstance Activity,这是因为第一个和第三个standard Activity在同一个返回栈中,只有当这个栈全部清空了才会返回到singleInstance的栈中。

    参考:

    1. 第一行代码
    2. 技术小黑屋: 深入讲解Android中Activity launchMode
  • 相关阅读:
    两种数组,注意用法
    PD 导出数据库结构
    获取随机金额:上限下限都要取到
    mysql常用语句
    SQL替换字符串、条件查询
    jtopo树结构方法积累
    jtopo 学习
    .net C# SortedList用法
    .net C# List用法
    .Net中C# Dictionary 用法(转)
  • 原文地址:https://www.cnblogs.com/dracohan/p/5976869.html
Copyright © 2011-2022 走看看