Activity的launchMode相关

配置Activity时,可以指定“launchMode”加载模式的属性,下面记录一下Android中有关Activity的四种加载模式。

    standard 标准模式

Activity的默认加载模式是”standard“,利用该模式启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task栈中。

下面用代码来测试一下。分别创建ActivityA、ActivityB,ActivityA代码如下:

package com.example.activitylaunchmodetest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ActivityA extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Button btnA = new Button(this);
  setContentView(btnA);
  String content = "按钮A\n\n该Activity所在的taskId为:" + getTaskId();
  btnA.setText(content);
  btnA.setTextSize(50);
  btnA.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    startActivity(new Intent(ActivityA.this, ActivityB.class));
   }
  });
 }
}

ActivityB与ActivityA代码大同小异,只是ActivityB跳转到了自身ActivityB。如下代码:

startActivity(new Intent(ActivityB.this, ActivityB.class));

在AndroidManifest文件中配置ActivityB,运行程序,点击按钮A,跳转到ActivityB,点击按钮B,再次跳转到ActivityB,如下图:

此时当前Task栈中会有两个ActivityB(如果点击多次按钮B,那么会创建多个ActivityB),通过taskid可以看出Activity在同一个Task内,点击终端上的back键,从第二个ActivityB页面回退到第一个ActivityB页面,点击back键,回退到ActivityA页面,再次点击back键,回退到系统桌面。

singleTop Task顶单例模式

在AndroidManifest文件中配置ActivityB的launchMode为”singleTop“,如下:

 <activity
      android:name="com.example.activitylaunchmodetest.ActivityB"
      android:label="@string/app_name" 
      android:launchMode="singleTop">
 </activity>

运行程序,点击按钮A,跳转到ActivityB,点击按钮B,不会再做跳转,如下图:

点击按钮B时,由于当前ActivityB已经位于栈顶,所以系统不会再次创建ActivityB实例,而是直接复用已存在的ActivityB。所以无论点击多少次按钮B,Task栈中只会有一个ActivityB。点击终端上的back键,从ActivityB页面回退到ActivityA页面,再次点击back键,回退到系统桌面。

我们再创建ActivityC,代码与ActivityA和ActivityB大同小异,将ActivityB中的代码修改为跳转到ActivityC,而ActivityC跳转到ActivityB。 在AndroidManifest文件中配置ActivityC,ActivityB的launchMode不变,ActivityA与ActivityC launchMode选择默认。再次运行程序,分别点击按钮A→按钮B→按钮C→按钮B,如下图。

点击按钮C时,由于目标ActivityB不在栈顶,所以系统会再次创建ActivityB实例(多次点击,ActivityB与ActivityC会交替出现),点击终端上的back键,会经过ActivityB→ActivityC→ActivityB→ActivityA→系统桌面。

singleTask Task内单例模式

在AndroidManifest文件中修改ActivityB的launchMode为”singleTask“,如下:

<activity
     android:name="com.example.activitylaunchmodetest.ActivityB"
     android:label="@string/app_name" 
     android:launchMode="singleTask">
</activity>

运行程序,分别点击按钮A→按钮B→按钮C,如下图:

点击按钮C跳转到ActivityB时,系统会把位于ActivityB上的所有Activity(此处ActivityC位于ActivityB上,移出ActivityC)都移出Task栈,使目标ActivityB位于栈顶(多次点击,ActivityC会交替入栈与出栈)。点击终端上的back键,会经过ActivityB→ActivityA→系统桌面。

singleInstance  全局单例模式

再次修改ActivityB的launchMode为”singleInstance“,如下:

<activity
     android:name="com.example.activitylaunchmodetest.ActivityB"
     android:label="@string/app_name" 
     android:launchMode="singleInstance">
</activity>

运行程序,分别点击按钮A→按钮B→按钮C→按钮B→按钮C,如下图:

点击按钮A跳转到ActivityB时,系统会创建一个新的Task,然后再创建ActivityB实例。点击按钮C跳转到ActivityB时,系统会把ActivityB所在的Task转到前台(根据taskid可以看出ActivityB和ActivityA、ActivityC不在同一个栈),多次点击,由于ActivityC还是standard模式,所以会不断创建,而ActivityB则会不断转移到前台,保证全局中只有一个ActivityB,并且它所在的栈中只有自己本身,且位于栈顶。点击终端上的back键,会现将ActivityB从自己栈中移出,再经过ActivityC→ActivityC→ActivityA→系统桌面。

注意,如果点击顺序为按钮A→按钮B→按钮C→按钮B,此时没有再点击按钮C,那么当前栈中最顶端的页面是ActivityC,点击back键时,会先经过ActivityC→ActivityC→ActivityA,将ActivityA与ActivityC从自己的栈中依次移出后,再将ActivityB栈中的ActivityB移出,此时的完整顺序为ActivityC→ActivityC→ActivityA→ActivityB→系统桌面。

写了这么多,最后总结如下:

时间: 2024-08-07 08:32:20

Activity的launchMode相关的相关文章

android当中taskAffinity属性与launchMode相关

一.本文尝试解释以下问题 1.  Activity被启动之后放在哪个任务栈当中?与哪些因素有关? 2.  Activity的四种启动模式对Activity的启动有哪些影响? 3.  在Activity中使用startActivityForResult(intent, REQUESTCODE);和onActivityResult() 是否与被启动的Activity的launchMode有关?如果有关,有什么关系? 二.Activity被启动之后放在哪个任务栈当中?与哪些因素有关? 1.基本论断:A

基础总结篇之三:Activity的task相关

古人學問無遺力,少壯工夫老始成.紙上得來終覺淺,絕知此事要躬行.南宋.陸遊<冬夜讀書示子聿(yù)> 软件行业也是一样,多少前辈不遗余力的奋斗才出现了软件行业的繁荣的景象,其中已有不少成为大师级人物.今天我们站在伟人的肩膀上,自然会有不少的优势,但不要忘了,要在对技术的认知方面有所提升,仍需我们去实践,去实践. 今天我们来讲一下Activity的task相关内容. 上次我们讲到Activity的四种启动模式的时候,已经了解到一些关于task的技术,今天我再向大家介绍一下.task是一个具有栈结

Activity的launchMode详细分析

在研究了Activity的启动过程后,我觉得很有必要对Activity的launchMode进行分析一下,因为到目前为止,我发现网上对launchMode的讲解都是通过实例讲解,看完了总是似懂非懂的感觉,并没有根本上理解launchMode的原理.这里我会从源码的角度讲解launchMode.相信大家会和我一样,看了源码之后就会有一种豁然开朗的感觉. Activity的启动模式一种有四种,分别如下: 1.standard 2.singleTop 3.singleTask 4.singleInst

Activity的launchMode和任务栈小结

对Activity的launchMode的理解一直没有好好总结下,这两天系统总结下launchMode的用法: Activity的launchMode属性决定了Activity和应用程序当前任务栈之间的关系.一个应用程序当前任务栈管理着应用程序的activity集合的Activity归属和Activity间的交互.开发人员想要开发的App拥有良好的交互,因此,深入对Activity的launchMode的理解能帮助我们开发性能良好和交互合理的App. Activity的launchMode主要有

【转】Activity的launchMode分析 及 Intent.FLAG_NEW_TASK详解

Activity的启动模式共有四种,分别如下: 1.standard 2.singleTop 3.singleTask 4.singleInstance 这里我们分两种情况讨论上述四种启动模式:app内和app之间 首先讨论app内 standard:不论当前任务栈中是否存在该Activity,都会新建一个Activity,如 任务栈为A B,要启动B 那么任务栈为 A B B singleTop:如果当前要创建的Activity就在任务栈的顶端,那么不会创建新的Activity,仅仅调用Act

android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode

转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50749728 首先还是先介绍下Activity的launchMode.一共同拥有四种. 1.standard. 2.singleTop. 3.singleTask. 4.singleInstance. 第一种standard.就是无论怎么样每次启动都会创建一个新的实例.也就是系统默认的启动方式. 我们设置ActivityA的启动方式为standard.设置点击运行startActiv

Activity 的 launchMode(加载模式)

在Androidmanifest.xml文件中可以给每隔Activity设置launchMode(加载模式)属性.该属性可以设置四种加载模式: <activity android:name="test.activity.MainActivity" android:launchMode="standard" /> 1.standard(默认) 1)从task中启动Activity时,该Activity的新实例总是在当前task中创建. 2)每次启动Acti

Activity的LaunchMode应用场景思考

本文链接:http://blog.csdn.net/xiaodongrush/article/details/28597855 1. 有哪几种类型?分别有什么用? http://developer.android.com/guide/components/tasks-and-back-stack.html standard,创建一个新的Activity. singleTop,栈顶不是该类型的Activity,创建一个新的Activity.否则,onNewIntent. singleTask,回退

Activity之launchMode(运行模式)

一.Activity 的launchMode(运行模式)共有4种,分别是:standard,singleTop,singleTask,    singleInstance 1 .standard:(备注:standard是系统默认的启动模式.) 标准启动模式,每次激活Activity 时都会创建Activity,并放入任务栈中.如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志,则这个Activity与启动他的Activity在同一个Task中,如