Activity的跳转方式:1.intent.addFlags(),2.四种launchMode

本文深入解析Android中Activity与Task之间的关系,详细介绍IntentFlag在界面跳转和服务启动过程中的作用,包括如何控制Activity在Task中的顺序、保留或清除历史Activity等关键功能。同时,阐述了Activity的四种launchMode及其应用场景,为开发者提供优化用户体验的技术指导。

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

一、Activity和Task(栈)的关系
  Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西 (Activity)则会处于最下面,最后添加的东西(Activity)则会在最低端。从Task中取出东西(Activity)则是从最顶端取出,也 就是说最先取出的是最后添加的东西(Activity),一次类推,最后取出的是第一次添加的Activity,而Activity在Task中的顺序是 可以控制的,那则在Activity跳转时用到Intent Flag
  二、界面跳转和服务的启动都会用到Intent,现在介绍Intent Flag是关于Activity的跳转
  Intent intent = new Intent(this,xxx.class);
 1. /如果activity在task存在,拿到最顶端,不会启动新的Activity。但是这会导致传递的Intent为空,原因大概是直接复用原来的Activity导致Intent没有更新,这时候需要复写一个方法/
  

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
    }

这样才能让Intent正常传递值到要跳转的activity。**/

  intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
  2./如果activity在task存在,这个会有保留之前的activity,至于产生的 activity是新的activity还是copy原来的activity还有待考证,知道的可 以留 言给我/
  intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
  3.//如果activity在task存在,将Activity之上的所有Activity结束掉
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  4.//默认的跳转类型,将Activity放到一个新的Task中
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  5.//如果Activity已经运行到了Task,再次跳转不会在运行这个Activity
  intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  Intent Flag有20多种,以上只是介绍了5种
2. Activity的四种launchMode
1. standard
默认的启动模式,当启动这个FirstActivity时总是会生成一个新的FirstActivity放到堆栈中。
2. singleTop
跳转时系统会先在栈结构中寻找是否有一个FirstActivity实例正位于栈顶,如果有则不再生成新的,而是直接使用。如果不是在栈顶,则会新生成一个activity
3. singleTask
在这个跳转过程中系统发现有存在的FirstActivity实例,于是不再生成新的实例,而是将FirstActivity之上的Activity实例统统出栈,将FirstActivity变为栈顶对象
4. singleInstance
这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入
http://blog.youkuaiyun.com/liuhe688/article/details/6754323/

package com.android.settings.spa import android.content.Context import android.content.Intent import android.os.Bundle import android.util.Log import androidx.annotation.VisibleForTesting import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin import com.android.settingslib.spa.framework.BrowseActivity import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.util.SESSION_BROWSE import com.android.settingslib.spa.framework.util.appendSpaParams import com.google.android.setupcompat.util.WizardManagerHelper class SpaActivity : BrowseActivity() { override fun isPageEnabled(page: SettingsPage) = super.isPageEnabled(page) && !isSuwAndPageBlocked(page.sppName) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(HideNonSystemOverlayMixin(this)) } companion object { private const val TAG = "SpaActivity" /** The pages that blocked from SUW. */ private val SuwBlockedPages = setOf(AppInfoSettingsProvider.name) @VisibleForTesting fun Context.isSuwAndPageBlocked(name: String): Boolean = if (name in SuwBlockedPages && !WizardManagerHelper.isDeviceProvisioned(this)) { Log.w(TAG, "$name blocked before SUW completed.") true } else { false } @JvmStatic fun Context.startSpaActivity(destination: String) { val intent = Intent(this, SpaActivity::class.java) .appendSpaParams(destination = destination) .appendSpaParams(sessionName = SESSION_BROWSE) startActivity(intent) } } }这些代码解释
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值