背景 我们在做Android自动化测试过程中,经常会需要获取应用的启动Activity页面信息,那么今天就来跟大家分享一下有哪些获取应用启动Activity页面信息的方法。...方案 下面介绍的方案都是非侵入式的: 1、通过logcat命令过滤activity启动相关的日志,杀掉应用进程后重新打开,打印出的第一行日志中,如下图红框部分就是启动Activity。...,打开应用的同时执行下面的命令: adb shell dumpsys window windows | grep 包名 3、可以用上篇文章中《推荐一款超好用的Android反编译工具》提到的反编译方法获取...: 4、通过aapt命令获取,脚本如下: #!...-n "${launch_activity}" ]]; then echo "抱歉没有找到启动activity" else echo "${package_name}/${launch_activity
一般来讲,我们会使用反射来调用Acticity中的mReferrer字段来获取跳转来源的包名。...一旦mReferrer被伪造,轻则业务逻辑出错,重则造成经济损失,针对这种情况,有没有办法找到一种较为安全的来源获取方法呢? 这就需要对mReferrer的来源进行一次分析。...who就是context,也就是我们的Activity。 到这里就可以确认 mReferrer其实就是使用context的getBasePackageName()来实现的。...Binder进程可不是应用层面可以干涉的了,我们可以放心大胆的使用这个Uid,不用担心被伪造,剩下的就是如何使用Uid获取PackageName了。...3.3 使用Uid置换PackageName 我们检索代码,发现ActivityTaskManagerService恰好提供了获取Uid的方法。
Activity启动流程很多文章都已经说过了,这里说一下自己的理解。 Activity启动流程分两种,一种是启动正在运行的app的Activity,即启动子Activity。...如无特殊声明默认和启动该activity的activity处于同一进程。如果有声明在一个新的进程中,则处于两个进程。另一种是打开新的app,即为Launcher启动新的Activity。...后边启动Activity的流程是一样的,区别是前边判断进程是否存在的那部分。 Activity启动的前提是已经开机,各项进程和AMS等服务已经初始化完成,在这里也提一下那些内容。...在通过ActivityStackSupervisor来获取当前需要显示的ActivityStack。 6....ActivityStack.resumeTopActivityLocked :获取栈顶的activity,并通知Launcher应该pause掉这个Activity以便启动新的activity。
Activity 一般通过Activity.startActivity(Intent)来启动Activity。...在startActivityAsUser方法中,会通过Starter池获取到一个ActivityStarter对象,然后设置一些参数,最后调用execute方法执行Activity的启动。...在execute方法中,会调用executeRequest方法,这里会处理启动Activity的请求,并开始一个Activity启动的旅程(代码注释原话)。...在Activity的启动过程中,Activity都是通过ActivityRecord来表示的。...Activity了(若对应Activity的进程尚未启动,则会通过ATMS的startProcessAsync方法启动进程,这就是另一个流程了)。
详细过程 2.1 启动MainActivity 2.1.1 生命周期 2.1.2 Activity栈 2.2 MainActivity中启动SecondActivity 2.2.1 生命周期 2.2.2...Activity栈 2.3 SecondActivity中启动MainActivity 2.3.1 生命周期 2.3.2 Activity栈 2.4 MainActivity中启动SecondActivity...总结 “singleTask”模式启动的Activity,在启动时,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务是否存在:如果存在,则在该任务中启动;如果不存在,则会在新任务中启动...因此,如果想要设置“singleTask”启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity的值。...如果设置了“singleTask”启动模式的Activity不是在新的任务中启动的,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,会调用该实例的onNewIntent,并且会把位于这个
一、LaunchMode 预备知识:任务栈(回退栈),后进先出 standard(标准模式):默认启动模式,每创建一个新Activity,都会产生一个新的Activity实例并且放入相应的任务栈中。...也就是说,在它启动的时候,系统会为它分配一个新的任务栈。由于singleTask的复用性,在其他需要创建Activity的时候,都不会创建新的Activity。...用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时呆在的那个Task里。...一般来说,当Activity启动后,它就与启动它的Task关联,并且在那里耗尽它的整个生命周期。...注:在Intent中设置标志位来指定启动模式 比 通过AndroidMenifest.xml为Activity指定启动模式 优先级高。
Activity启动流程很多文章都已经说过了,这里说一下自己的理解。 Activity启动流程分两种,一种是启动正在运行的app的Activity,即启动子Activity。...如无特殊声明默认和启动该activity的activity处于同一进程。如果有声明在一个新的进程中,则处于两个进程。另一种是打开新的app,即为Launcher启动新的Activity。...暂停完,在该activity还不可见时,通知AMS,根据要启动的Activity配置ActivityStack。然后判断要启动的Activity进程是否存在?...在通过ActivityStackSupervisor来获取当前需要显示的ActivityStack。 6....ActivityStack.resumeTopActivityLocked :获取栈顶的activity,并通知Launcher应该pause掉这个Activity以便启动新的activity。
上一期我们学习了Activity的创建和配置,当时留了一个悬念,如何才能在默认启动的Activity中打开其他新建的Activity呢?那么本期一起来学习如何启动和关闭Activity。...至于应用中的其他Activity,通常都由入口 Activity启动,或由入口 Activity启动的Activity启动。 Activity启动其他Activity有如下两个方法。...startActivityForResult(Intent intent, int requestCode):以指定的请求码(requestCode)启动Activity,而且程序将会获取新启动的Activity...); // 获取应用程序中的启动按钮 Button startBtn = (Button) findViewById(R.id.start_btn);...View.OnClickListener() { @Override public void onClick(View source) { // 获取启动当前
以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里面栈的信息在启动进程前都已经准备好了...(), r.intent); // 获取之前创建的Application Application app = r.packageInfo.makeApplication(false...Activity onStart函数 activity.performStart(); } 大体流程可以用下图表示 activity启动.png 参考: 网络课程 --剖析Framework
Launcher 里的icon点击,执行到AMS.startActivity(),告诉 AMS 我要启动一个新的 activity Launcher 进程 标记 A , AMS 进程标记 B Launcher...APP 执行 onPause AMS从ProcessRecord中发现当前 APP 进程未启动,创建 APP进程标记 C,然后启动ActivityThread APP进程 C 初始化 启动APP 进程的...activity ActivityManager.getService()获取到 AMS 的代理对象,执行startActivity() 接着就进入到 AMS 的 startActivity() 方法...//如果是 APP 内启动新 Activity 则执行这个分支 realStartActivityLocked(r, app, andResume, checkConfig...activity 启动 setContentView 过程 见相关文章 更多内容 欢迎关注公众号 [p6mj2gp1f9.jpg?
Android 应用程序启动过程 Activity启动过程可以分为两种:一种是根activity的启动过程,另一种是普通activity启动过程。...根activity指的是应用程序启动的第一个activity,因此也可以理解为应用程序的启动过程。普通activity除根activity以外的其他activity。...根Activity启动流程 点击桌面应用图标,Launcher进程将启动Activity的请求以Binder的方式发送给了AMS。...ActivityStarter:Activity启动的控制器,处理Intent与Flag对Activity启动的影响,具体说来有: 寻找符合启动条件的Activity,如果有多个,让用户选择; 校验启动参数的合法性...首先获取Activity的组件信息 ActivityInfo aInfo = r.activityInfo; if (r.packageInfo == null) {
考察要点: 启动Activity会经历哪些生命周期回调 冷启动大致流程,涉及哪些组件,通信过程是怎么样的? Activity启动过程中,生命周期回调的原理?...进程A与AMS的交互过程 此处以跨进程启动Activity分析一下源码流程: A调用startActivity时,需要与AMS交互,此时需要需要获取到AMS的代理对象Binder也就是上图的AMP,通过...ActivityManagerNative.getDefault()获得,并调用AMP的startActivity方法,然后会通过mRemote.transact方法进行Binder通信,在AMS的onTransact方法里面会获取到请求的...attach方法里面,其实是一个跨进程的调用,首先通过 ``` IActivityManager mgr = ActivityManagerNative.getDefault(); ``` 获取到AMS...然后调用 ``` realStartActivityLocked(hr,app,true,true); ``` 方法,来启动Activity,如果我们不是启动另外一个进程,而是同一进程,那么这第二大部分就不会存在了
前言 我相信大家肯定遇到过Activity启动慢的BUG,在优化问题之前,我们都会自我测试一下Activity启动耗时是不是和测试给的数值一样,在我们没有高速相机的情况下,我们如何获得Activity...启动时间。...我一般都用这个指令: adb logcat -b all | grep am_activity_launch_time 注意结果最后的数字297,代表Activity启动的时长297ms。...但是有时候测试标准不一样,测试标准可能要求是整个界面完全显示出来,尤其是需要异步网络请求数据,后面几帧展现更多UI,对于这个情况,Activity启动时间就要远远大于am_activity_launch_time...但是通过am_activity_launch_time来衡量一个Activity启动时间还是很科学的。
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...activity了,那么久不重复创建了,这种模式是singleTop的启动模式,单一顶部 清单文件中,activity节点下 设置启动模式android:launchMode=”singleTop” 应用场景...,如果已经存在了,那么就清空此activity上面的所有其他界面,复用此界面 应用场景:浏览器应用,查找清单文件看到BrowerActivity是这个模式,这个activity比较笨重,因为他是用c写的...webkit浏览器的内核,当开启多个标签页的时候,其实只是一个activity实例,这样比较节省资源。...singleInstance模式,单一实例,当界面启动开启任务栈以后,点击这个界面,又会创建出来一个单独的任务栈,只存放着这一个activity实例,如果这个activity开启,就会把这个activity
Activity为什么需要启动模式: 当我们多次启动同一个Activity的时候,系统会创建多个实例,并把它们一一放入任务栈当中,当我们单击back键的时候,会发现这些Activity会一一回退。...在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。...Activity的Flags 比较常用的几个Flag FLAG_ACTIVITY_NEW_TASK 这个标记位作用是指定Activity的启动模式为“singleTask”启动模式,其效果和XML中指定该启动模式相同...FLAG_ACTIVITY_SINGLE_TOP 这个标记位作用是指定Activity的启动模式为“singleTop”启动模式,其效果和XML中指定该启动模式相同。...如果被启动的Activity采用standard模式启动,那么连同它之上的Activity都要出栈,系统都会创建新的Activity实例并放入栈顶。
Activity的启动通常从startActivity开始。...的启动过程转移到了mStackSupervisor.startActivityMayWait方法中了(E:\adt\sdk\sources\android-23\com\android\server\am..., r); } 很简单,把启动Activity所需要的信息保存起来,然后sendMessage。...ActivityThread.performLaunchActivity(" + r + ")"); //******************************************* 获取组件信息...(activity); } 最后启动Activity 附图说明 ?
standard 这个模式我们不用显示指定,因为它是Activity默认的启动模式,例如以下代码就是以standard模式启动的: Intent intent = new Intent(this...singleTop 栈顶复用模式,顾名思义:如果在任务栈中的栈顶已经存在该Activity,再次启动Activity则不会重新创建实例,会直接复用栈顶的Activity。 一图胜千言: ?...singleTask 栈内复用模式 这是个单实例模式,我们启动Activity一般会默认创建一个栈,属性于包名相同,这个是我们的默认栈,通过standard启动的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...Hist #0: ActivityRecord{a0bc5f0 u0 com.wp.launchmode/.ActivityA t27} Stack #0: 打开activityC ACTIVITY...MANAGER ACTIVITIES (dumpsys activity activities) Display #0 (activities from top to bottom): Stack...MANAGER ACTIVITIES (dumpsys activity activities) Display #0 (activities from top to bottom): Stack
SingleTop–在当前栈为自己的时候只能启动一次 一个栈 SingleTask–只能启动一次 在一个栈 SingleInstance–一个实例存在不同栈 standard标准模式 每次启动都一个...Activity都会重新创建一个新的实例 singleTop栈顶复用模式 如果在任务栈顶那么Activity不会重建 singleTask栈内复用模式 单实例模式 singleInstance单实例模式...启动后新创建一个任务栈 activity android:name=".MainActivity" android:configChanges="screenLayout" android...new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
领取专属 10元无门槛券
手把手带您无忧上云