Android基础之Activity四大启动模式

本文深入讲解了Android中Activity的四种启动模式:standard、singleTop、singleTask和singleInstance,通过图文并茂的方式帮助读者理解这些模式的工作原理及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity的启动模式非常重要,也是面试常常会问到的问题。因为比较抽象,所以对于初学者来说还是比较难以深刻理解的,所以我觉得还是图文简介才能更通俗地理解它。

在学习四大启动模式之前,我们必须先学习并理解返回栈这个知识点。

返回栈:
        Activity是可以重叠的,我们每启动一个新的Activity,就会覆盖在原来的Activity上,然后点击Back键会销毁最上面的Activity,下面的一个Activity就会重新显示出来。
Android是使用任务(Task)来管理的,一个任务就是一组存放在栈里的活动的集合,这个栈称为返回栈(Back Stack).

栈是一种先进后出的数据结构。

如右图所示:把返回栈比喻成一个容器,Activity实例是物品,且刚刚好大小能放进去。

最先进栈的Activity实例1只能最后出来,而最迟进栈的Activity实例4则处于栈顶,最先出来。

相信这样子很容易理解返回栈的基本概念了吧。

顺便提一下Activity生命周期中的几种状态:

    运行状态:位于返回栈栈顶。
    暂停状态:当一个Activity不再处于栈顶,但仍然可见。
    停止状态:不再处于栈顶,并且完全不可见
    销毁状态:一个Activity从返回栈中移除

接下来我们可以开开心心地学习Activity的四大启动模式啦!

Activity的启动模式一共四种,standard、singleTop、singleTask、和singleInstance。

如何选择你需要的Activity启动模式呢?在AndroidManifest.xml清单文件中通过给<activity>标签指定android:lauchMode属性来确定


1.standard :标准模式(默认模式)
每当通过这种模式来启动一个新的目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到返回栈(Task)中,并且处于栈顶的位置。
举个例子:
在MainActivity中,再去启动它自己,代码如下:(一般不会这么做,只是为了演示这种模式的效果)
Intent intent  = new Intent(MainActivity.this,MainActivity.class);
startActivity(intent);
如右图所示,如果你在standard 模式下启动了三次同一个Activity(此处是MainActivity),
虽然这三个MainActivity对象都是同一个Activity的实例,在 standard 标准模式下,系统不会在乎这个activity是否已经存在返回栈中,每次启动这个activity都会创建一个新的activity实例,添加到返回栈的栈顶位置。
这种模式下不会启动新的返回栈,新创建的activity实例都会被添加到原有的返回栈中。

2.singleTop:栈顶模式:
在此模式下启动Activity时,如果发现返回栈的栈顶已经是该Activity了,则可以直接使用它,不会再创建新的Activity实例。
比如说,在singleTop模式下启动MainActivity的时候,
1.系统发现栈顶不是MainActivity的实例,如果返回栈中是图1的情况,
则系统会去创建一个新的MainActivity实例,并且把它加载到栈顶位置。
2.如果返回栈是图2的情况,栈顶已经是MainActivity,则直接使用,不会再
创建activity实例。









3.singleTask:栈中模式:
每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果存在则直接使用,不存在则创建一个
比如,使用此模式启动MainActivity,在返回栈中只能有一个MainActivity实例。
情况1:如果返回栈中不存在将要启动的MainActivity的实例,则系统会创建一个新的MainActivity实例,并且将它添加到返回栈的栈顶位置。
情况2:返回栈中存在MainActivity的实例,且它位于栈顶位置,则直接使用
情况3:如右图,返回栈中存在MainActivity实例,但位于栈中间,此时系统会把位于MainActivity实例上面的其他Activity实例都移出返回栈,使MainActivity处于栈顶位置。




4.singleInstance:单例模式:
指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个Activity。不管哪个程序来访问这个Activity。都共用一个返回栈,也就解决了共享Activity实例的问题。

在这种模式下,系统保证无论从哪个返回栈(Task)中启动目标Activity,只会创建一个目标Activity实例,并会用一个全新的返回栈来加载该Activity实例。

例如:将要以这种模式来启动MainActivity

情况1:如果将要启动的MainActivity实例不存在,系统会先创建一个新的返回栈(Task)再创建MainActivity实例,并且将MainActivity实例添加到栈顶。

情况2:如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中、位于哪个返回栈(Task)中,系统都会将该Activity所在的返回栈(Task)转到前台,使该Activity显示出来。

Activity有单例模式共享Activity实例。

我们平常写代码在适合的场合也会用到单例模式获取对象,以此达到节约资源的目的(但不可滥用)

下面贴一个自己写的单例模式获取对象,用到了Volley框架,说不定有时候会用到呢!

<span style="font-size:18px;">单例模式获取队列对象

import android.content.Context;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

public class HttpUtils  {//单例模式

private RequestQueue mQueue;
private static HttpUtils mInstance;

private HttpUtils(Context context){
    mQueue = Volley.newRequestQueue(context);
   }

/**
    * 获取单例对象的公开静态方法
* @param context
* @return
*/
public static HttpUtils getInstance(Context context){
    if (mInstance == null){
    synchronized (HttpUtils.class){

    if (mInstance == null){
        mInstance = new HttpUtils(context);
            }
         }
      }
      return mInstance;
   }
/**
    * 把请求加入队列的方法
* @param req
*/
public void sendRequest(Request req){
    mQueue.add(req);
   }

}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值