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. 黄聪:WIN7下回收站不小心删除的文件怎么恢复,免费数据恢复软件下载

    上网找了半天,大多数是收费的,总算找到一款免费的,已经帮我恢复了数据了,在此分享给大家. 注意:只能恢复7天内的,而且数据误删了,就尽量不要再修改你那个盘符的数据了,免得覆盖了! 我用的数据恢复软件R ...

  2. bzoj4466 超立方体

    Description 超立方体是立方体在高维空间内的拓展(其在 2 维情况下退化为正方形,1维情况下退化成线段).在理论计算机科学领域里,超立方体往往可以和 2 进制编码联系到一起.对理论计算机科学 ...

  3. Bootstrap-CL:进度条

    ylbtech-Bootstrap-CL:进度条 1.返回顶部 1. Bootstrap 进度条 本章将讲解 Bootstrap 进度条.在本教程中,您将看到如何使用 Bootstrap 创建加载.重 ...

  4. VMware vSphere Client下增加虚拟机磁盘空间的方法

    随着系统运维时间的增长,磁盘就日益的损耗,如果遇到虚拟机报磁盘空间不足怎么办?还好,我们可以通过磁盘阵列增加磁盘空间,然后扩容到虚拟机中去. 对于linux虚拟机磁盘扩容的方案有两种,一种就是原有的实 ...

  5. php去除换行符的方法小结(PHP_EOL变量的使用)

    本来在unix世界换行就用/n来代替,但是windows为了体现他的不同,就用/r/n,更有意思的是在mac中用/r.因此unix系列用 /n,windows系列用 /r/n,mac用 /r,这样就用 ...

  6. 利用U盘安装Redhat-server-Linux-7.1

    利用U盘安装Redhat-server-Linux-7.1 [原]红帽 Red Hat Linux相关产品iso镜像下载[百度云]

  7. PHP生产二维码

    1.引入phpqrcode包 <?php include 'phpqrcode.php'; QRcode::png('http://www.learnphp.cn',"code.png ...

  8. 迷你MVVM框架 avalonjs 0.84发布

    本版本只要做了如下改进 重构ui绑定 fix scanTag bug ms-include 的值必须不为空值,否则不做任何操作.

  9. swagger2 注解整体说明

    @Api:用在请求的类上,表示对类的说明 tags="说明该类的作用,可以在UI界面上看到的注解" value="该参数没什么意义,在UI界面上也看到,所以不需要配置&q ...

  10. mysql 塞数据

    ./mysql_.py -H109.105.4.65 -P32773 -uroot -proot.123 --database=test_database --number=10 sysbench - ...