Activity启动模式是非常重要的一块内容,启动模式直接关系到用户的体验 和 性能的提升等

Activity启动模式分为四种:

  

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

  standard 标准的

  singleTop 独占顶端

  singleTask 单任务

  singleInstance 单实例


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


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

NewActivity设置为 独占顶端模式(singleTop) 的配置:

     <!-- 启动模式 实验的Activity singleTop -->
<activity android:name=".launch_mode.NewActivity"
android:launchMode="singleTop"
/>

NewActivity设置为 独占顶端模式(singleTop) 的效果图:

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

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

12-12 20:15:24.624 2347-2347/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 457
12-12 20:15:40.820 2347-2347/liudeli.activity D/launchMode: NewActivity 任务栈ID: 457
12-12 20:15:44.081 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了
12-12 20:15:47.190 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了
12-12 20:15:48.611 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了
12-12 20:15:50.180 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了
12-12 20:15:50.535 2347-2347/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了


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

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

NewActivity设置为 独占顶端模式(singleTask) 的配置:

     <!-- 启动模式 实验的Activity singleTask -->
<activity android:name=".launch_mode.NewActivity"
android:launchMode="singleTask"
/>

NewActivity设置为 独占顶端模式(singleTask) 的效果:

(当启动过一次NewActivity,启动三次LoginActivity 然后再次启动NewActivity的时候 会从栈底往上找 一旦找到 直接杀到栈顶 然后NewActivity会被重用)

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

12-12 20:44:34.646 2935-2935/? D/launchMode: LoginActivity 任务栈ID: 462
12-12 20:44:38.398 2935-2935/liudeli.activity D/launchMode: NewActivity 任务栈ID: 462 
12-12 20:44:40.501 2935-2935/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 462 
12-12 20:44:41.919 2935-2935/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 462
12-12 20:44:42.884 2935-2935/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 462
12-12 20:44:43.752 2935-2935/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 462
12-12 20:44:47.421 2935-2935/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了


singleInstance 单实例,特点就是:再次启动NewActivity的时候会重用,不会进栈

singleTop 和 singleInstance 对比:

  singleTop只有在顶端才会被重用

  singleInstance在任意端都会被重用,singleInstance还会单独开启一个任务栈

NewActivity设置为 独占顶端模式(singleInstance) 的配置:

     <!-- 启动模式 实验的Activity singleInstance -->
<activity android:name=".launch_mode.NewActivity"
android:launchMode="singleInstance"
/>

NewActivity设置为 独占顶端模式(singleInstance) 的效果:

(当启动过一次NewActivity,在启动LoginActivity,当再次启动NewActiviy的时候会断开(第一次启动NewActivity的引用),连接现在新的引用)

(点击返回Back的时候,任务栈里面只有三个Activity的引用了)

12-12 21:19:12.011 3374-3374/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 463
12-12 21:19:27.999 3374-3374/liudeli.activity D/launchMode: NewActivity 任务栈ID: 464
12-12 21:19:36.304 3374-3374/liudeli.activity D/launchMode: LoginActivity 任务栈ID: 463
12-12 21:19:41.347 3374-3374/liudeli.activity D/launchMode: onNewIntent NewActivity被重用了


测试四种启动模式的代码:---------------------

LoginActivity.java

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) {
startActivity(new Intent(this, NewActivity.class));
} /**
* 启动自己
* @param view
*/
public void startThis(View view) {
startActivity(new Intent(this, LoginActivity.class));
}
}

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.java

onNewIntent() 方法可以监听Activity是否被重用了
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-Activity启动模式(launchMode)的更多相关文章

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

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

  2. Android Activity 启动模式详解

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

  3. AndroidのActivity启动模式

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

  4. Android Activity 启动模式和任务栈

    在了解了基本的Activity的生命周期后,我们能够很好的在一个Activity上面做相关的业务.但是这是不够的,因为Android通过任务栈来保存整个APP的Activity,合理的调度任务栈才能够 ...

  5. 深入Activity,Activity启动模式LaunchMode完全解析

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53221384本文出自[DylanAndroid的博客] 在平时的开发中,我们可 ...

  6. Android Activity启动模式

    <activity android:name=".MainActivity" android:launchMode="singleTask"> &l ...

  7. 详解Android Activity启动模式

    相关的基本概念: 1.任务栈(Task)   若干个Activity的集合的栈表示一个Task.   栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...

  8. android:Activity启动模式之singleTask(一)

    先看一下standard启动模式的说明: 仅仅有一个实例.在同一个应用程序中启动他的时候.若不存在此Activity实例.则会在当前栈顶创建一个新的实例.若存在,则会把栈中在其上的其他Activity ...

  9. activity启动模式launchMode区别和优化

    初学android的开发人员,可能会经常忽略这个重要的设置. Activity一共有以下四种launchMode:1.standard2.singleTop3.singleTask4.singleIn ...

  10. android activity 启动模式

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 1,标准的, 2,单个 顶部 3,单个 任务 4,单个 实例 标准的 就是 每启动一次这 ...

随机推荐

  1. <只看这个就够了。。。>Android自动化测试及性能优化

    Android自动化测试及性能优化 分类: Android Java Tools2012-12-09 23:31 4300人阅读 评论(0) 收藏 举报 软件自动化测试对于程序员来说能够确保软件开发的 ...

  2. 转转转---js正则表达exec与match的区别说明

    正则表达式对象有两个定义方式:: 1.第一种定义: new RegExp(pattern, attributes);如var reg = new RegExp("abc",&quo ...

  3. bootstrap全局css样式

    以下从官网抄来的,感觉还是很实用的,运用得好,灵活运用,非常方便快捷,能大大提高开发效率,也为调整不同尺寸的屏幕节省了时间. hidden-xs @media (max-width: 767px){ ...

  4. Python链表与反链表

    # -*- coding:utf8 -*- #/usr/bin/env python class Node(object): def __init__(self, data, pnext = None ...

  5. 0001_mysql 5.7.25安装初始化

    一.   下载mysql https://dev.mysql.com/downloads/mysql/ 二.   选择社区版本 三.   选择版本下载: 四.   跳过注册直接下载: 五.   解压后 ...

  6. 20181205_C#窗体监听键盘事件

    1. 需要设置窗体的   KeyPreview = true; 2. 如果窗体上有获取的了焦点的button按钮, 则监听不到 Enter事件, 需要取消按钮的焦点

  7. servlet 3.0无需配置web.xml,使用注入方式配置servlet实现登陆功能(服务器需要支持servlet3.0)

    首先申明上面的报错红叉,我也不知道怎么回事.总之能运行. 新建项目时选择java EE6.0,低版本没有servlet3.0. 先看一个基本示例. Test.java是用来测试无需配置文件,无需静态页 ...

  8. 引用变量类型的加载顺序(类名+引用名=new +类名();)

    程序如下: 运行结果如下: 以上结果说明:同一个引用名称(可以把它当做变量的一种类型)可能指代不同的对象,依据同一个引用是否处于同一个初始化的层次,决定是否在完成: static Cup c1=new ...

  9. OpenCL 矢量存取

    ▶ 函数 vloadn 和 vstoren 来实现全局存储器和局部存储器之间的向量拷贝 ● 代码 #include <stdio.h> #include <stdlib.h> ...

  10. 潜类别模型(Latent Class Modeling)

    1.潜类别模型概述 潜在类别模型(Latent Class Model, LCM; Lazarsfeld & Henry, 1968)或潜在类别分析(Latent Class Analysis ...