Android-intent.addFlags-Activity启动模式
之前写的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启动模式的更多相关文章
- Android开发之---Activity启动模式
在Android开发中,启动一个新的activity我们可以使用startActivity或startActivityForResult,Android系统使用栈的方式来管理一个APP的页面显示与保存 ...
- android:process结合activity启动模式的一次实践
会有这样的场景,一个应用崩溃了,而导致的该应用崩溃的原因是,该应用占用的内存大小超过了系统分配给它的最大堆大小.对象的分配,是发生在堆(heap)上面的,系统分配给每个应用的最大堆大小是固定的. 假设 ...
- Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 Android启动模式Flags栈Task 目录(?)[+] 什么是栈 栈 ...
- 【转】Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 在学习Android的过程中,Intent是我们最常用Android用于进程内或进 ...
- Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- 【转】Android总结篇系列:Activity启动模式(lauchMode)
[转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...
- Android组件体系之Activity启动模式解析
本文主要分析Activity的启动模式及使用场景. 一.Activity启动模式浅析 1.standard 标准模式,系统默认的启动模式.在启动Activity时,系统总是创建一个新的Activity ...
- Android Activity 启动模式详解
最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...
- AndroidのActivity启动模式
Activity启动模式 .概念 Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否 .属性 Activity的启 ...
- 关于Activity启动模式(launchMode)和intent设置测试后 发现和网上说的不符 是不是我错了 求解
看了很多关于Activity启动模式(launchMode)和intent设置intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);发现网上说的和我测试结果 ...
随机推荐
- maven package install deploy
1.maven package:打包到本项目,一般是在项目target目录下. 如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目, ...
- pymysql基本的使用方法
1.导入模块+创建连接 import pymysql # 1.通过python去连接数据库 conn = pymysql.connect(host="127.0.0.1",port ...
- mybatis结合redis实战二级缓存
之前的文章中我们意见分析了一级缓存.二级缓存的相关源码和基本原理,今天我们来分享下了mybatis二级缓存和redis的结合,当然mybatis二级缓存也可以和ehcache.memcache.OSC ...
- jDeveloper运行慢
最近在使用 Jdeveloper 10.1.3.3 版本时发现速度奇慢无比,后经Google,发现如下解决方案:在 jdev.conf 文件的末尾加上如下两行,速度即可得到显著的提高. AddVMOp ...
- DB2事务日志
1.DB2数据库的日志原理 事务日志记录数据库中所有对象和数据的改变,在早前版本中最大可达256G,其大小为( logprimary + logsecond ) * logfilsiz,其中logpr ...
- java Arrays.asList用法
java Arrays.asList用法 用途 Arrays是java容器相关操作的工具类,asList方法将Array转换为list,是Array和List之间的桥梁. 注意 Arrays.asLi ...
- js父子窗口传值以及当前页面在js前台如何获得url参数
1.首先是父页面用window.open打开窗口 <%@ Page Language="C#" AutoEventWireup="true" CodeBe ...
- li.active2有加强重要性的效果。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- linux(rhel) rescue修复详解
修复linux,先准备好一张安装光盘,光驱安装好后开机,选择从光驱启动.等待安装盘显示操作界面时选择"rescue"选项,如果有光标提示的话,也可以输入:linux rescue进 ...
- ubuntu系统下安装pyspider:搭建pyspider服务器新手教程
首先感谢“巧克力味腺嘌呤”的博客和Debian 8.1 安装配置 pyspider 爬虫,本人根据他们的教程在ubuntu系统中进行了实际操作,发现有一些不同,也出现了很多错误,因此做此教程,为新手服 ...