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);发现网上说的和我测试结果 ...
随机推荐
- java基础六 [异常处理](阅读Head First Java记录)
在程序运行时,我们不能保证所有服务和方法都是正确的,如果发生问题报错会导致程序崩溃,所以需要对一些可以预见的错误进行异常处理,通过throw去抛出一个异常,然后用try..catch..将要执行的该方 ...
- A* 算法详解
最近刷bin巨的搜索进阶专题,做到一个需要A*算法来解决的题,于是开始学A*算法,十分有用处的算法,虽然看上去听复杂的,但其实原理很容易理解,下面转自一篇文章,讲得真的很好. 转:https://ww ...
- 数字组合 · Combination Sum
不能重复: [抄题]: 给出一个候选数字的set(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T.C中的数字可以无限制重复被选取. 例如,给出候选数组[2,3,6,7]和目标数字7,所求 ...
- [leetcode]211. Add and Search Word - Data structure design添加查找单词 - 数据结构设计
Design a data structure that supports the following two operations: void addWord(word) bool search(w ...
- dedecms的自定义模块
dedecms的自定义模块 1.在dedecms主目录下创建一个模块目录 2.在模块目录下创建如下目录 网站根目录/ |-自定义模块 |-control 控制器 |-model 模型 |-stat ...
- Spring框架的AOP技术(注解方式)
1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...
- c3p0数据源配置
Xml代码 <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: --> ...
- 03 解析库之Beautifulsoup模块
Beautifulsoup模块 一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式 ...
- toArray()
- setTimeout setInterval 详解
http://www.jb51.net/article/74606.htm var tttt=setTimeout('northsnow()',1000);//执行一次 clearTimeou ...