zoukankan      html  css  js  c++  java
  • Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。

    Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();

    一.Android Activity 四种启动模式 lunchMode 在Manifest 配置文件中的属性如下:

    (1) android:launchMode="standard"

    (2)android:launchMode="singleTop"

    (3)android:launchMode="singleTask"

    (4)android:launchMode="singleInstance"

    二.说明:

    Android 中Activity 生命周期 跟Task 的关系,就是进栈出栈。

    很多时候我们在Manifest的Activiy 配置信息中没有看到lunchMode 属性,其实没有配置这个属性就是系统默认属性 android:launchMode="standard"。同一个工程AppA在这种模式下有AfirstActivity 启动 AsecondActivity,启动代码是:

     
    1
    2
    3
    4
    5
                    Intent intent = new Intent();
             
            intent.setClass(this, AsecondActivity.class);
             
            startActivity(intent);

    Log 打印如下:

    两个TaskId 都是98.说明两个 activity 是在同一个 任务栈 Task 中。

    接下来我们让这两个Activity 不在同一个Task 中。有两种方法实现:

    (1)不修改启动代码,只修改 Mnaifest 中 给AsecondActivity 配置多添加 两行代码如下:

     
    1
    2
    android:launchMode="singleTask"
    android:taskAffinity="com.***"


    (2)修改启动代码:

     
    1
    2
    3
    4
    5
    6
    7
    8
    Intent intent = new Intent();
            // ComponentName name = new
            // ComponentName("com.example.appa","com.example.appa.AsecondActivity");
            // intent.setComponent(name);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setClass(this, AsecondActivity.class);
             
            startActivity(intent);


    多添加了一行

     
    1
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    在修改 Mnaifest 中AsecondActivity 配置多添加一行

     
    1
    android:taskAffinity="com.***"

    看Log打印:

    AfirstActivity taskId = 8 而 AsecondActivity TaskId = 9.所以两个 activity 不是在同一个任务栈 Task 中。虽然两个activity 是在同一个工程下面。

    分析:

    由此看出,代码里设置

     
    1
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    和配置文件中设置

     
    1
    android:launchMode="singleTask"

    的效果是一样的。 但是请注意,这里要两个条件满足才 会让两个activity 不在同一个Task 中。必须 加上 属性

     
    1
    android:taskAffinity="com.***"

    有些人会奇怪,一般Manifest 配置文件中 很少看见 这个属性,这个属性的意思 是 “task 空间”=== “任务空间” 是的,当你没有设置的时候也是系统默认给设置 成为 当前应用的包名。我们这里设置 的和包名不一样。所以两个activity 的任务空间是不一样的,所以两个 activity 不在同一个 Task 中。 当然了,只是设置了

     
    1
    android:taskAffinity="com.***"

    没有设置

     
    1
    android:launchMode="singleTask"

    或者

     
    1
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    两个 activity 也是在同一个任务空间的。亲测。

    总结:当设置了

     
    1
    android:launchMode="singleTask"

    时,系统会查找 对应的

     
    1
    taskAffinity

    任务空间是否 有启动过 这个activity ,如果没有启动,则在这个taskAffinity 任务空间启动,如果有启动过,则 将 这个activity 推送到栈顶, 那么在这个activity 之上的activity 都被推送出栈了,不在任务Task 中,也就是 Ondestroy 了。

    三.当 配置文件中设置了 android:launchMode="singleInstance"。不管 activity 怎么启动,都是在一个新的Task 任务中启动activity。

    看Log 打印:

    两个TaskId 不一样。并且 被启动的activity 唯一存在 新的任务队列中,也就是这个task 队列中只能有 一个activity。

  • 相关阅读:
    k8s之一键部署docker及k8s脚本(适用于centos7,cnetos8及ubuntu)
    k8s之使用Kubeadm部署k8s集群
    lnmp架构之一键搭建wordpress博客网站脚本(适用于centos7和centos8)
    一键编译安装nginx-1.18.0脚本(适用centos7,ubuntu1804,debian10)
    xshell登陆服务器步骤
    xshell无法连接到linux主机原因分析
    数据库文件备份与还原
    Linux服务器运维基本命令
    服务器运维操作命令
    firewalld的基本使用
  • 原文地址:https://www.cnblogs.com/yaya-Android/p/4098975.html
Copyright © 2011-2022 走看看