之前写的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. java基础六 [异常处理](阅读Head First Java记录)

    在程序运行时,我们不能保证所有服务和方法都是正确的,如果发生问题报错会导致程序崩溃,所以需要对一些可以预见的错误进行异常处理,通过throw去抛出一个异常,然后用try..catch..将要执行的该方 ...

  2. A* 算法详解

    最近刷bin巨的搜索进阶专题,做到一个需要A*算法来解决的题,于是开始学A*算法,十分有用处的算法,虽然看上去听复杂的,但其实原理很容易理解,下面转自一篇文章,讲得真的很好. 转:https://ww ...

  3. 数字组合 · Combination Sum

    不能重复: [抄题]: 给出一个候选数字的set(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T.C中的数字可以无限制重复被选取. 例如,给出候选数组[2,3,6,7]和目标数字7,所求 ...

  4. [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 ...

  5. dedecms的自定义模块

    dedecms的自定义模块   1.在dedecms主目录下创建一个模块目录 2.在模块目录下创建如下目录 网站根目录/ |-自定义模块 |-control 控制器 |-model 模型 |-stat ...

  6. Spring框架的AOP技术(注解方式)

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...

  7. c3p0数据源配置

    Xml代码   <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: --> ...

  8. 03 解析库之Beautifulsoup模块

    Beautifulsoup模块   一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式 ...

  9. toArray()

  10. setTimeout setInterval 详解

      http://www.jb51.net/article/74606.htm   var tttt=setTimeout('northsnow()',1000);//执行一次 clearTimeou ...