2、Activity 的 4 种加载模式 在 android 的多 activity 开发中,activity 之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个 activity...加载模式便是决定以哪种方式启动一个跳转到原来某个 Activity 实例。...使用这个标志,如果正在启动的 Activity 的 Task 已经在运行的话,那么,新的 Activity 将 不会启动;代替的,当前 Task 会简单的移入前台。...这种方式下,新的 Activity 可以调用 setResult(int),并且这个结果值将发送给那个作为答复目标的 Activity。...由于默认的系统不包含图形 Task 管理功能,因此,你不应该使用这个标志,除非你提供给用户一种方式可以返回到已经启动的 Task。
零、前言 standard:默认的启动模式 |---启动一个Activity,该Activity就会在返回栈中入栈 |---该Activity处于栈顶的位置 |---每次启动都会创建该...Activity的新实例 singleTop: |---在启动活动时若栈顶已经是该Activity,则认为可以直接使用它 singleTask: |---整个应用程序的上下文中只存在一个实例...|---两次相同实例之间的Activity会被杀死 singleInstance: |---启用一个新的返回栈来管理这个活动 一、测试类 Activity1 public class...模式,第二次的Activity2并没有创建 ?...转载请注明 更多安卓技术欢迎访问:https://www.jianshu.com/c/004f3fe34c94 张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com 你的喜欢与支持将是我最大的动力
概述 总是看到Activity的四种启动模式:Standard,SingleTask,SingleTop,SingleInstance,而且都是借助于官方文档理解的。...但是在写demo测试的时候,发现这个说法是不准确的。这句话成立的条件是,要启动的Activity的affinity是唯一的,即当前所有的任务中没有与该affinity相同的任务。...总结 “singleTask”模式启动的Activity,在启动时,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务是否存在:如果存在,则在该任务中启动;如果不存在,则会在新任务中启动...因此,如果想要设置“singleTask”启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity的值。...如果设置了“singleTask”启动模式的Activity不是在新的任务中启动的,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,会调用该实例的onNewIntent,并且会把位于这个
考察要点: 启动Activity会经历哪些生命周期回调 冷启动大致流程,涉及哪些组件,通信过程是怎么样的? Activity启动过程中,生命周期回调的原理?...进程A与AMS的交互过程 此处以跨进程启动Activity分析一下源码流程: A调用startActivity时,需要与AMS交互,此时需要需要获取到AMS的代理对象Binder也就是上图的AMP,通过...,并告知Zygote进程启动之后,加载ActivityThread这个类的入口main函数,启动完成后返回进程的pid,并向AMS的Handler发送一个延迟消息,为的是要求目标进程启动后,10秒钟内需要向...然后调用 ``` realStartActivityLocked(hr,app,true,true); ``` 方法,来启动Activity,如果我们不是启动另外一个进程,而是同一进程,那么这第二大部分就不会存在了...应用端Activity启动的几个步骤 realStartActivityLocked函数会调用app.thread.scheduleLaunchActivity(new Intent(r.intent)
activity的启动模式是Android的基础知识,这里就直入主题了。...Activity启动模式 standard模式 standard是activity的默认启动模式,每次activity启动时,都会创建一个新的实例化对象。...ActivityA为standard模式 singleTop模式 在启动activity之前会检查栈顶activity是否为启动的activity实例对象,如果是那么触发activity的onNewIntent...ActivityB为singleTop模式 singleTask模式 和singleTop的区别在与,启动activity之前不仅检查栈顶activity是否为启动的activity实例对象,而是检查整个堆栈中是否有该...activity的实例对象。
创建两个activity,创建两个布局文件,布局中两个按钮,开启第一和开启第二个 当第一个界面打开的时候,进程会创建一个任务栈,栈里面只有一个activity 点击第二个界面,任务栈里面会加入activity2...再次点击第二个界面,任务栈里面再次加入activity2 当点击返回的时候,最后一个先弹出,依次弹出,这是标准情况下,standard模式 在一些特殊的情况下,为了避免糟糕的用户体验,如果发现任务栈的栈顶存在这个...activity了,那么久不重复创建了,这种模式是singleTop的启动模式,单一顶部 清单文件中,activity节点下 设置启动模式android:launchMode=”singleTop” 应用场景...webkit浏览器的内核,当开启多个标签页的时候,其实只是一个activity实例,这样比较节省资源。...singleInstance模式,单一实例,当界面启动开启任务栈以后,点击这个界面,又会创建出来一个单独的任务栈,只存放着这一个activity实例,如果这个activity开启,就会把这个activity
Activity为什么需要启动模式: 当我们多次启动同一个Activity的时候,系统会创建多个实例,并把它们一一放入任务栈当中,当我们单击back键的时候,会发现这些Activity会一一回退。...Activity的四种启动模式 standard:标准模式 标准模式,这也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。...一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。...Activity的Flags 比较常用的几个Flag FLAG_ACTIVITY_NEW_TASK 这个标记位作用是指定Activity的启动模式为“singleTask”启动模式,其效果和XML中指定该启动模式相同...如果被启动的Activity采用standard模式启动,那么连同它之上的Activity都要出栈,系统都会创建新的Activity实例并放入栈顶。
接下来是singleTask的作用:**如果要启动的Activity存在于活动栈中,那么系统将会将活动栈中在这个Activity对象上面的所有Activity都出栈(被系统回收),并将这个要启动的Activity...Activity ok,关于Activity的启动模式就这么多。...最后总结一下4种启动模式: standard:不管要启动的Activity是否已经存在与活动栈,都会创建一个新的Activity对象处于活动栈栈顶。...singleTask:如果要启动的Activity对象存在活动栈,那么系统将不会创建新的Activity对象,而是会把活动栈中处于这个要启动的Activity对象上面的所有Activity对象出栈(被系统回收...),要启动的Activity自然处于活动栈栈顶。
大家好,又见面了,我是你们的朋友全栈君。...测试应用主activityA使用默认启动模式 ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Display #0 (activities...ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Display #0 (activities from top to bottom...MANAGER ACTIVITIES (dumpsys activity activities) Display #0 (activities from top to bottom): Stack...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
Activity启动流程很多文章都已经说过了,这里说一下自己的理解。 Activity启动流程分两种,一种是启动正在运行的app的Activity,即启动子Activity。...如无特殊声明默认和启动该activity的activity处于同一进程。如果有声明在一个新的进程中,则处于两个进程。另一种是打开新的app,即为Launcher启动新的Activity。...后边启动Activity的流程是一样的,区别是前边判断进程是否存在的那部分。 Activity启动的前提是已经开机,各项进程和AMS等服务已经初始化完成,在这里也提一下那些内容。...涉及到的类 ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。...(点击原文链接查看原图) 涉及到的进程 Launcher所在的进程 AMS所在的SystemServer进程 要启动的Activity所在的app进程 如果是启动根Activity,就涉及上述三个进程。
在execute方法中,会调用executeRequest方法,这里会处理启动Activity的请求,并开始一个Activity启动的旅程(代码注释原话)。...在Activity的启动过程中,Activity都是通过ActivityRecord来表示的。...在这里,TaskRecord相当于在启动模式中的“任务栈”,根据启动模式的不同,在启动Activity的时候,会对TaskRecord进行不同的操作。...Activity了(若对应Activity的进程尚未启动,则会通过ATMS的startProcessAsync方法启动进程,这就是另一个流程了)。...而mH的处理方式就是把这个事务交给mTransactionExecutor来执行。 2.
standard: 标准(默认)模式 当通过这种模式来启动Activity时,Android总会为目标 Activity创建一个新的实例,并将该Activity添加到当前 Task栈中.注意,这种方式不会启动新的...:当将要被 启动的Activity已经位于Task栈顶时,系统不会重新创建 目标Activity实例,而是直接复用Task栈顶的Activity 假设 栈结构为 ABC 再打开C C为singleTop...当系统采用singleTask模式加载Activity时,又分为以下 三种情况: (1)如果将要启动的Activity不存在,那么系统将会创建该 实例,并将其加入Task栈顶 (2)如果将要启动的Activity...已存在,且存在栈顶,那么此时 与singleTop模式的行为相同 (3)如果将要启动的Activity存在但是没有位于栈顶,那么 此时系统会把位于该Activity上面的所有其他Activity 全部移出...实例 放入此全新的Task中 (2)如果将要启动的Activity已存在,那么无论它位于哪个应用 程序,哪个Task中;系统都会把该Activity所在的Task转到 前台,从而使该Activity
Activity启动流程很多文章都已经说过了,这里说一下自己的理解。 Activity启动流程分两种,一种是启动正在运行的app的Activity,即启动子Activity。...如无特殊声明默认和启动该activity的activity处于同一进程。如果有声明在一个新的进程中,则处于两个进程。另一种是打开新的app,即为Launcher启动新的Activity。...后边启动Activity的流程是一样的,区别是前边判断进程是否存在的那部分。 Activity启动的前提是已经开机,各项进程和AMS等服务已经初始化完成,在这里也提一下那些内容。...涉及到的进程 Launcher所在的进程 AMS所在的SystemServer进程 要启动的Activity所在的app进程 如果是启动根Activity,就涉及上述三个进程。...暂停完,在该activity还不可见时,通知AMS,根据要启动的Activity配置ActivityStack。然后判断要启动的Activity进程是否存在?
一、LaunchMode 预备知识:任务栈(回退栈),后进先出 standard(标准模式):默认启动模式,每创建一个新Activity,都会产生一个新的Activity实例并且放入相应的任务栈中。...也就是说,在它启动的时候,系统会为它分配一个新的任务栈。由于singleTask的复用性,在其他需要创建Activity的时候,都不会创建新的Activity。...用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时呆在的那个Task里。...一般来说,当Activity启动后,它就与启动它的Task关联,并且在那里耗尽它的整个生命周期。...典型用法是:把一个应用程序的Activity移到另一个应用程序的主Task中。 例如,如果e-mail中包含一个web页的链接,点击它就会启动一个Activity来显示这个页面。
image.png ApplicationThread --> Activity 从ApplicationThread到真正启动一个Activity流程如下: image.png AMS 将启动 Activity...因此后续执行 Activity 生命周期的过程都是由 ApplicationThread 指导完成的,scheduleTransaction 方法如下: @Override...,并且 Message 中的 obj 就是启动 Activity 的事务对象。...这个 Handler 的具体实现是 ActivityThread 中的 mH 对象。...对应的窗口,然后进入final Activity a = performLaunchActivity(r, customIntent)函数中创建并显示 Activity。
Activity是一个组件,组件的启动是要通过AMS的,和Application的启动一样,Activity的启动也会涉及到AMS、Zygote以及应用进程之间的socket通信以及Binder调用。...上图就是Activity组件启动的流程,当我们通过startActivity启动一个Activity组件的时候,系统首先会向AMS发起调用,AMS会首先检查当前Activity组件所在的应用进程是否已经被启动...之后AMS会在此通过应用进程的Binder调用,调用应用进程创建Activity组件,如上图中的scheduleLaunchActivity 要是应用进程已经启动,就是有上面的6,AMS直接通过应用的Binder...上面的跨进程通信的过程中,除了AMS和Zygote的通信方式是本地socket,其他的跨进程通信都是通过Binder机制完成的。...AMS在通过Binder调用,调用应用进程启动Activity组件的过程中: 1. 首先应用进程会通过ClassLoader加载对应的class字节码文件; 2.
的启动操作。...信息的操作由 mSupervisor 来实现,它是 ActivityStackSupervisor 类型,从名字也能猜出它主要是负责 Activity 所处栈的管理类。...有时候我们通过隐式 Intent 启动 Activity 时,系统中可能存在多个 Activity 可以处理 Intent,此时会弹出一个选择框让用户选择具体需要打开哪一个 Activity 界面,就是此处的逻辑处理结果...方法来获取启动 Activity 的结果。...方法来执行启动 Activity 的操作。
image.png 目录 activity的启动流程(一) activity的启动流程(二) activity的启动流程(三) activity的启动介绍 activity源码 整个 startActivity...的流程分为 3 大部分,也涉及 3 个进程之间的交互: ActivityA --> ActivityManagerService(简称 AMS) ActivityManagerService -->...image.png ActivityA --> ActivityManagerService 在android中,使用startActivity函数启动另一个activity时候,实际执行的代码如下:...ar.getResultData()); } cancelInputsAndStartExitTransition(options); } 可以看出,内部真正执行的是...mInstrumentation在Activity类中的声明: // set by the thread after the constructor and before onCreate(Bundle
上一期我们学习了Activity的创建和配置,当时留了一个悬念,如何才能在默认启动的Activity中打开其他新建的Activity呢?那么本期一起来学习如何启动和关闭Activity。...至于应用中的其他Activity,通常都由入口 Activity启动,或由入口 Activity启动的Activity启动。 Activity启动其他Activity有如下两个方法。...上面两个方法都用到了 Intent参数,Intent是Android应用里各组件之间通信的重要方式,一个Activity通过Intent来表达自己“意图”——想要启动哪个组件,被启动的组件既可是 Activity...// 方式一 // 创建Intent对象 Intent intent1 = new Intent(); // 设置需要启动的Activity,以及要启动Activity的上下文环境 intent1.setClass...(this, MyActivity.class); // 方式二 // 直接创建Intent对象,包含要启动的Activity信息 Intent intent2 = new Intent(this,
以Activity A 启动 Activity B,Activity B所在进程未启动为例 大体经过已经几个阶段: startActivity.png 第一步 Activity A 调用AMS 启动接口...这是一个binder通讯,正常启动Activity的方式,一般我们都会通过以下的方式启动一个新的Activity startActivity(new Intent(A_Activity.this,B_Activity.class..., app, } stack为mFocusStack, 这一部为取出栈顶的Activity,即我们要启动的activity,虽然之前activity没启动,但ams里面栈的信息在启动进程前都已经准备好了...这里调用了应用的scheduleLaunchActivity,从名字看表示可以加载activity了 第五步 Activity启动 下面就切回到ActivityThread中去执行 public final..."); } break; getPackageInfoNoCheck 会去loadApk加载apk的一些信息,后面启动activity需要调用到,下面会去执行的activity
领取专属 10元无门槛券
手把手带您无忧上云