配置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,如下图:

Activity的launchMode相关_第1张图片

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

    singleTop Task顶单例模式

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

  

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

Activity的launchMode相关_第2张图片

    点击按钮B时,由于当前ActivityB已经位于栈顶,所以系统不会再次创建ActivityB实例,而是直接复用已存在的ActivityB(调用自己的onNewIntent(Intent intent)方法)。所以无论点击多少次按钮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,如下图。

Activity的launchMode相关_第3张图片

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

    singleTask Task内单例模式

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

   

    运行程序,分别点击按钮A→按钮B→按钮C,如下图:Activity的launchMode相关_第4张图片

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

    singleInstance  全局单例模式

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

   

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

Activity的launchMode相关_第5张图片

    点击按钮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→系统桌面。

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

Activity的launchMode相关_第6张图片

更多相关文章

  1. Android 开发模式:mvp+retrofit2+rxjava + rxAndroid + dagger2
  2. [Android菜鸟笔记]xml实现编辑框/按钮的椭圆样(shape标签)+应用
  3. 【Android】Android intent 系统调用大全
  4. 【读书笔记】Android 输入系统
  5. Android音频系统之AudioPolicyService的启动及audio_policy.conf
  6. Android系统集成第三方pre-build库和程序
  7. Android 开发 及 编译系统
  8. [Android设计模式]Android退出应用程序终极方法

随机推荐

  1. StagefrightPlayer&&AwesomePlayer 初步
  2. cvc-complex-type.2.4.d: 发现了以元素 '
  3. Laravel 创建可以传递参数 Console服务的
  4. laravel 根据不同组织加载不同视图的实现
  5. laravel 实现划分admin和home 模块分组
  6. laravel在中间件内生成参数并且传递到控
  7. laravel通过a标签从视图向控制器实现传值
  8. linux文本处理三剑客之awk
  9. 解决在laravel中leftjoin带条件查询没有
  10. 解决Laravel5.5下的toArray问题