Android-Activity启动模式(launchMode)
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)的更多相关文章
- 关于Activity启动模式(launchMode)和intent设置测试后 发现和网上说的不符 是不是我错了 求解
看了很多关于Activity启动模式(launchMode)和intent设置intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);发现网上说的和我测试结果 ...
- Android Activity 启动模式详解
最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...
- AndroidのActivity启动模式
Activity启动模式 .概念 Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否 .属性 Activity的启 ...
- Android Activity 启动模式和任务栈
在了解了基本的Activity的生命周期后,我们能够很好的在一个Activity上面做相关的业务.但是这是不够的,因为Android通过任务栈来保存整个APP的Activity,合理的调度任务栈才能够 ...
- 深入Activity,Activity启动模式LaunchMode完全解析
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53221384本文出自[DylanAndroid的博客] 在平时的开发中,我们可 ...
- Android Activity启动模式
<activity android:name=".MainActivity" android:launchMode="singleTask"> &l ...
- 详解Android Activity启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
- android:Activity启动模式之singleTask(一)
先看一下standard启动模式的说明: 仅仅有一个实例.在同一个应用程序中启动他的时候.若不存在此Activity实例.则会在当前栈顶创建一个新的实例.若存在,则会把栈中在其上的其他Activity ...
- activity启动模式launchMode区别和优化
初学android的开发人员,可能会经常忽略这个重要的设置. Activity一共有以下四种launchMode:1.standard2.singleTop3.singleTask4.singleIn ...
- android activity 启动模式
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 1,标准的, 2,单个 顶部 3,单个 任务 4,单个 实例 标准的 就是 每启动一次这 ...
随机推荐
- Mysql中用between...and...查询日期时注意事项
select count(1) from user where regist_date between '2017-07-25 00:00:00' and '2017-07-25 24:00:00' ...
- 基于Redis实现简单的分布式锁
在分布式场景下,有很多种情况都需要实现最终一致性.在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域模型和消息的持久化数据源),或者做全局XA ...
- Oracle VM Virtualbox基础知识
修改硬盘的UUID VBoxManage internalcommands sethduuid <filename>
- 五.jQuery源码解析之jQuery.extend(),jQuery.fn.extend()
给jQuery做过扩展或者制作过jQuery插件的人这两个方法东西可能不陌生. jQuery.extend([deep],target,object1,,object2...[objectN]) jQ ...
- mybatis一对多关联查询+pagehelper->分页错误
mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...
- Python开发一个WEB聊天室
项目实战:开发一个WEB聊天室 功能需求: 用户可以与好友一对一聊天 可以搜索.添加某人为好友 用户可以搜索和添加群 每个群有管理员可以审批用户的加群请求,群管理员可以用多个,群管理员可以删除.添加. ...
- pycharm中使用redis模块入门
数据缓存系统:1:mongodb:是直接持久化,直接存储于硬盘的缓存系统2:redis: 半持久化,存储于内存和硬盘3:memcache:数据只能存储在内存里的缓存系统 redis是一个key-val ...
- uva-11044-水题
#include <iostream> #include<memory.h> #include<stdio.h> using namespace std; int ...
- centos7.3给搭建SVN服务器
centos7.3给搭建SVN服务器 1 安装svnserver yum install subversion 2 查看版本 svnserve --version 3 创建版本库 3.1 运行以下命令 ...
- NodeJs通过async/await处理异步
##场景 远古时代 我们在编写express后台,经常要有许多异步IO的处理.在远古时代,我们都是用chunk函数处理,也就是我们最熟悉的那种默认第一个参数是error的函数.我们来模拟一个Mongo ...