之前写的Android-Activity启动模式(launchMode)Android-Activity启动模式-应用场景,讲解的都是在AndroidManifest.xml配置launchMode="四种启动模式"

Activity启动模式分为四种:

  

  如果不配置:launchMode,默认就是:standard 标准的

  standard 标准的

  singleTop 独占顶端

  singleTask 单任务

  singleInstance 单实例


standard 标准的,特点是:启动一个Activity就进栈一个Activity,启动六个Activity就进栈六个Activity

在LoginActivity --> intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  // 该Flag相当于Activity启动模式中的standard。

注意:⚠️ intent.addFlags(Activity模式); 为给指定调整的Activity设置此模式

/**
* 启动 NewActivity
* @param view
*/
public void startNewActivity(View view) {
Intent intent = new Intent(this, NewActivity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 该Flag相当于Activity启动模式中的singleTask
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 该Flag相当于Activity启动模式中的standard。
// intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // 以该旗标启动的Activity不会保留在Activity栈中
startActivity(intent);
}


singleTop 独占顶端,特点是LoginActivity在顶端的时候,启动LoginActivity会自动重用LoginActivity,不会进栈

在LoginActivity --> intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // Flag相当于Activity加载模式中的singleTop模式

注意:⚠️ intent.addFlags(Activity模式); 为给指定调整的Activity设置此模式

  /**
* 启动自己
* @param view
*/
public void startThis(View view) {
Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // Flag相当于Activity加载模式中的singleTop模式
startActivity(intent);
}

LoginActivity intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); :

(当LoginActivity在顶端,无论点击启动自己多少此都不会进栈 而是重用)

(当点击返回back键的时候,任务栈里面只有一个Activity的引用)

01-02 20:46:06.493 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:07.244 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:07.960 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:08.545 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:08.677 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:08.811 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:08.947 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.079 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.218 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.364 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.494 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.628 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.761 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了
01-02 20:46:09.914 2196-2196/liudeli.activity D/launchMode: onNewIntent LoginActivity被重用了


singleTask 单任务,特点是单任务,不会有两个NewActivity引用,NewActivity一旦进栈 就不会再次进栈了

在LoginActivity --> intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 该Flag相当于Activity启动模式中的singleTask

注意:⚠️ intent.addFlags(Activity模式); 为给指定调整的Activity设置此模式

/**
* 启动 NewActivity
* @param view
*/
public void startNewActivity(View view) {
Intent intent = new Intent(this, NewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 该Flag相当于Activity启动模式中的singleTask
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 该Flag相当于Activity启动模式中的standard。
// intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // 以该旗标启动的Activity不会保留在Activity栈中
startActivity(intent);
}

例如:NewActivity设置了 singleTask启动模式:当启动过一次NewActivity,再次启动NewActivity的时候,会自动从栈底往上找,一旦找到NewActivity(一直杀到最顶端)

01-02 21:16:54.414 3192-3192/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 89
01-02 21:17:12.164 3192-3192/liudeli.activity D/launchMode: NewActivity 任务栈ID: 89
01-02 21:17:15.201 3192-3192/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 89
01-02 21:17:17.884 3192-3192/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 89
01-02 21:17:18.698 3192-3192/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 89
01-02 21:17:21.416 3192-3192/liudeli.activity D/launchMode: NewActivity 任务栈ID: 89


在LoginActivity --> intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // 以该旗标启动的Activity不会保留在Activity栈中

注意:⚠️ intent.addFlags(Activity模式); 为给指定调整的Activity设置此模式

如果不给 NewActivity 添加intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);,任务栈里面会有四个Activity引用

目前给 NewActivity 添加intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);,任务栈里面会有三个Activity引用,NewActivity不会重复的保存到任务栈中


完整代码:

AndroidManifest.xml

     <activity android:name=".launch_mode.LoginActivity">

            <intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </activity> <activity android:name=".launch_mode.NewActivity" />

LoginActivity

package liudeli.activity.launch_mode;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View; import liudeli.activity.R; public class LoginActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login); /**
* 每款应用程序启动后,会默认有一个任务栈(用于存放Activity的引用)
* 任务栈有栈ID,随着应用程序的启动 栈ID是累加的
*/
int taskId = getTaskId();
Log.d("launchMode", "LoginActivity 任务栈ID: " + taskId);
} /**
* 启动 NewActivity
* @param view
*/
public void startNewActivity(View view) {
Intent intent = new Intent(this, NewActivity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 该Flag相当于Activity启动模式中的singleTask
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 该Flag相当于Activity启动模式中的standard。
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // 以该旗标启动的Activity不会保留在Activity栈中
startActivity(intent);
} /**
* 启动自己
* @param view
*/
public void startThis(View view) {
Intent intent = new Intent(this, LoginActivity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // Flag相当于Activity加载模式中的singleTop模式
startActivity(intent);
} /**
* 当Activity被重用了就会调用此方法
* @param intent
*/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d("launchMode", "onNewIntent LoginActivity被重用了");
}
}

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动新的Activity"
android:onClick="startNewActivity"
/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动自己"
android:onClick="startThis"
android:layout_alignParentRight="true"
/> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LoginActivity 永远都是标准模式"
android:layout_centerInParent="true"
android:textSize="20sp"
/> </RelativeLayout>

NewActivity

package liudeli.activity.launch_mode;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View; import liudeli.activity.R; public class NewActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new); /**
* 每款应用程序启动后,会默认有一个任务栈(用于存放Activity的引用)
* 任务栈有栈ID,随着应用程序的启动 栈ID是累加的
*/
int taskId = getTaskId();
Log.d("launchMode", "NewActivity 任务栈ID: " + taskId);
} /**
* 启动登录Activity
* @param view
*/
public void startLoginActivity(View view) {
startActivity(new Intent(this, LoginActivity.class));
} /**
* 启动自己
* @param view
*/
public void startThis(View view) {
startActivity(new Intent(this, NewActivity.class));
} /**
* 当Activity被重用了就会调用此方法
* @param intent
*/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d("launchMode", "onNewIntent NewActivity被重用了");
}
}

activity_new.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动登录Activity"
android:onClick="startLoginActivity"
/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="启动自己"
android:onClick="startThis"
/> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="newActivity"
android:layout_centerInParent="true"
android:textSize="20sp"
android:textColor="#f00"
/> </RelativeLayout>

Android-intent.addFlags-Activity启动模式的更多相关文章

  1. Android开发之---Activity启动模式

    在Android开发中,启动一个新的activity我们可以使用startActivity或startActivityForResult,Android系统使用栈的方式来管理一个APP的页面显示与保存 ...

  2. android:process结合activity启动模式的一次实践

    会有这样的场景,一个应用崩溃了,而导致的该应用崩溃的原因是,该应用占用的内存大小超过了系统分配给它的最大堆大小.对象的分配,是发生在堆(heap)上面的,系统分配给每个应用的最大堆大小是固定的. 假设 ...

  3. Activity启动模式 及 Intent Flags 与 栈 的关联分析

     http://blog.csdn.net/vipzjyno1/article/details/25463457    Android启动模式Flags栈Task   目录(?)[+] 什么是栈 栈 ...

  4. 【转】Activity启动模式 及 Intent Flags 与 栈 的关联分析

    http://blog.csdn.net/vipzjyno1/article/details/25463457    在学习Android的过程中,Intent是我们最常用Android用于进程内或进 ...

  5. Android中Activity启动模式详解

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

  6. 【转】Android总结篇系列:Activity启动模式(lauchMode)

    [转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...

  7. Android组件体系之Activity启动模式解析

    本文主要分析Activity的启动模式及使用场景. 一.Activity启动模式浅析 1.standard 标准模式,系统默认的启动模式.在启动Activity时,系统总是创建一个新的Activity ...

  8. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  9. AndroidのActivity启动模式

    Activity启动模式      .概念      Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否    .属性     Activity的启 ...

  10. 关于Activity启动模式(launchMode)和intent设置测试后 发现和网上说的不符 是不是我错了 求解

    看了很多关于Activity启动模式(launchMode)和intent设置intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);发现网上说的和我测试结果 ...

随机推荐

  1. js 触发 change 事件

    首先,请各位包涵,我本人对 JS 不是很熟,不知道"触发change事件"和"触发onchange事件"哪个更加合适.有园友知道的麻烦指出,先行谢过. 起因是这 ...

  2. linux的文件类型和权限

    Linux下使用ll或ls -l查看文件的信息 (ll和ls-l的区别:ll会显示出当前目录下的隐藏文件,而ls -l不会)   文件信息分为:文件类型.权限.链接数.所属用户.所属用户组.文件大小. ...

  3. 两个onCreate方法?你真的了解onCreate()么?

    Activity的onCreate方法一直是我们编写一个activity最先重载的方法.细心的小伙伴在编写代码的时候回看到这样一幕: 咦,这里怎么会有两个onCreate提供给我们重载?选择困难症患者 ...

  4. Labyrinth(记忆化BFS)

    Labyrinth http://codeforces.com/problemset/problem/1064/D time limit per test 2 seconds memory limit ...

  5. Java Tomcat下载、安装和环境变量配置

    win10下Tomcat的下载.安装和环境变量的配置 -----made by siwuxie095                             1.首先到Tomcat官网,传送阵:点击开 ...

  6. 兼容多浏览器的网页复制插件(ZeroClipboard)

    前言: 常规利用JS编写的网页复制功能是最简单的方法,但是只对IE有效,无法做到兼容其它浏览器,对其他浏览器也就只能弹窗提示用户手动复制了. <script type="text/ja ...

  7. 【Linux 进程】之关于父子进程之间的数据共享分析

    之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...

  8. 【校招面试 之 C/C++】第4题 拷贝构造函数被调用的3个时机

    1.被调用的3个时机: (1)直接初始化或拷贝初始化: (2)将一个对象作为一个实参传递,形参采用非指针或非引用的对象进行接收时(指针即指向了同一块空间,并未实现拷贝:而引用就是实参本身): (3)函 ...

  9. 3sum, 3sum closest

    [抄题]: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...

  10. java POI创建Excel示例(xslx和xsl区别 )

    Java用来处理office类库有很多,其中POI就是比较出名的一个,它是apache的类库,现在版本到了3.10,也就是2014年2月8号这个版本. 在处理PPT,Excel和Word前,需要导入以 ...