Android Activity的四种LaunchMode!!!

蜂信物联FastBee平台https://gitee.com/beecue/fastbee

阿里资料开源项目https://gitee.com/vip204888

百度低代码前端框架https://gitee.com/baidu/amis

OpenHarmony开源项目https://gitcode.com/openharmony

仓颉编程语言开放项目https://gitcode.com/Cangjie

区分Activity的加载模式,通过示例一目了然。这里编写了一个Activity A(ActA)和Activity B(ActB)循环跳转的例子。对加载模式修改和代码做稍微改动,就可以说明四种模式的区别。

standard

首先说standard模式,也就是默认模式,不需要配置launchMode。先只写一个名为ActA的Activity:

view plain print ?

  1. package com.easymorse.activities;

  2. import android.app.Activity;

  3. import android.content.Intent;

  4. import android.os.Bundle;

  5. import android.view.View;

  6. import android.view.View.OnClickListener;

  7. import android.widget.Button;

  8. import android.widget.LinearLayout;

  9. import android.widget.TextView;

  10. public class ActA extends Activity {

  11. /** Called when the activity is first created. */

  12. @Override

  13. public void onCreate(Bundle savedInstanceState) {

  14. super.onCreate(savedInstanceState);

  15. TextView textView = new TextView(this);

  16. textView.setText(this + “”);

  17. Button button = new Button(this);

  18. button.setText(“go actA”);

  19. button.setOnClickListener(new OnClickListener() {

  20. @Override

  21. public void onClick(View v) {

  22. Intent intent = new Intent();

  23. intent.setClass(ActA.this, ActA.class);

  24. startActivity(intent);

  25. }

  26. });

  27. LinearLayout layout = new LinearLayout(this);

  28. layout.setOrientation(LinearLayout.VERTICAL);

  29. layout.addView(textView);

  30. layout.addView(button);

  31. this.setContentView(layout);

  32. }

  33. }

package com.easymorse.activities; 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; import android.widget.LinearLayout; import android.widget.TextView; public class ActA extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText(this + “”); Button button = new Button(this); button.setText(“go actA”); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(ActA.this, ActA.class); startActivity(intent); } }); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); } }

例子中都没有用layout,免得看着罗嗦。可见是ActA –> ActA的例子。在界面中打印出对象的toString值可以根据hash code识别是否创建新ActA实例。

第一个界面:

[外链图片转存中…(img-glDoMFsw-1725186086543)]

点击按钮后:

[外链图片转存中…(img-gowBUXte-1725186086544)]

可以多点几次。发现每次都创建了该Activity的新实例。standard的加载模式就是这样的,intent将发送给新的实例。

现在点Android设备的回退键,可以看到是按照刚才创建Activity实例的倒序依次出现,类似退栈的操作,而刚才操作跳转按钮的过程是压栈的操作。如下图:

[外链图片转存中…(img-aXfxHDWE-1725186086544)]

singleTop

singleTop和standard模式,都会将intent发送新的实例(后两种模式不发送到新的实例,如果已经有了的话)。不过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

还是用刚才的示例,只需将launchMode改为singleTop,就能看到区别。

运行的时候会发现,按多少遍按钮,都是相同的ActiA实例,因为该实例在栈顶,因此不会创建新的实例。如果回退,将退出应用。

[外链图片转存中…(img-Yw8bHN75-1725186086544)]

singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。

如果是A Activity跳转到B Activity,再跳转到A Activity,行为就和standard一样了,会在B Activity跳转到A Activity的时候创建A Activity的新实例,因为当时的栈顶不是A Activity实例。

ActA类稍作改动:

view plain print ?

  1. package com.easymorse.activities;
  1. import android.app.Activity;
  1. import android.content.Intent;
  1. import android.os.Bundle;
  1. import android.view.View;
  1. import android.view.View.OnClickListener;
  1. import android.widget.Button;
  1. import android.widget.LinearLayout;
  1. import android.widget.TextView;
  1. public class ActA extends Activity {
  1. /** Called when the activity is first created. */
  1. @Override
  1. public void onCreate(Bundle savedInstanceState) {
  1. super.onCreate(savedInstanceState);
  1. TextView textView = new TextView(this);
  1. textView.setText(this + “”);
  1. Button button = new Button(this);
  1. button.setText(“go actB”);
  1. button.setOnClickListener(new OnClickListener() {
  1. @Override
  1. public void onClick(View v) {
  1. Intent intent = new Intent();
  1. intent.setClass(ActA.this, ActB.class);
  1. startActivity(intent);
  1. }
  1. });
  1. LinearLayout layout = new LinearLayout(this);
  1. layout.setOrientation(LinearLayout.VERTICAL);
  1. layout.addView(textView);
  1. layout.addView(button);
  1. this.setContentView(layout);
  1. }
  1. }

package com.easymorse.activities; 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; import android.widget.LinearLayout; import android.widget.TextView; public class ActA extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText(this + “”); Button button = new Button(this); button.setText(“go actB”); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(ActA.this, ActB.class); startActivity(intent); } }); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); } }

ActB类:

view plain print ?

  1. package com.easymorse.activities;
  1. import android.app.Activity;
  1. import android.content.Intent;
  1. import android.os.Bundle;
  1. import android.view.View;
  1. import android.view.View.OnClickListener;
  1. import android.widget.Button;
  1. import android.widget.LinearLayout;
  1. public class ActB extends Activity {
  1. @Override
  1. protected void onCreate(Bundle savedInstanceState) {
  1. super.onCreate(savedInstanceState);
  1. Button button=new Button(this);
  1. button.setText(“go actA”);
  1. button.setOnClickListener(new OnClickListener() {
  1. @Override
  1. public void onClick(View v) {
  1. Intent intent=new Intent();
  1. intent.setClass(ActB.this, ActA.class);
  1. startActivity(intent);
  1. }

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

  1. startActivity(intent);
  1. }

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值