ActivityManagerService是如何启动app

一.      上一篇文章app的启动过程,说明了launcher启动app是通过binber,让ActivityManagerService的startactivity来启动app的。

二.      代码不再详细贴出,只给出重要的代码

跟踪到ActivityManagerService的startactivity,执行了startActivityAsUser方法,----》

ActivityStackSupervisor的startActivityMayWait方法,这里保存了appInfo,然后调用startActivityLocked进一步操作把Launcher应用程序的进程信息保存在callerApp变量中,把Launcher的activity信息保存在sourceRecord变量中.调用startActivityUncheckedLocked。
 
分析一下startActivityUncheckedLocked这个方法
 



 

这是方法名字和参数。

这里实现了,启动activity的四种启动模式,

需要启动app就是创建一个新的task来启动这个activity。

这里判定栈顶是不是要启动的activity。

备注:mHomeStack : 只记录存放Launcher和SystemUI(最近应用)的Task,mFocusedStack : 记录所有非Launcher App的Task。mStacks : 这个ArrayList只存放 mHomeStack和 mFocusedStack, mHomeStack 放在第0个位置

这些准备工作完成后,最后就进入startActivityLocked(r, newTask, doResume)进一步处理了,这不影响activity的启动,再调用resumeTopActivityLocked. 它首先看要启动的Activity是否就是当前处理Resumed状态的Activity,如果是的话,那就什么都不用做,直接返回就可以了;否则再看一 下系统当前是否休眠状态,如果是的话,再看看要启动的Activity是否就是当前处于堆栈顶端的Activity,如果是的话,也是什么都不用做。把当处于Resumed状态的Activity推入Paused状态,然后才可以启动新的Activity。但是在将当前这个Resumed状态的 Activity推入Paused状态之前,首先要看一下当前是否有Activity正在进入Pausing状态,如果有的话,当前这个Resumed状 态的Activity就要稍后才能进入Paused状态了,这样就保证了所有需要进入Paused状态的Activity串行处理.

这里的schedulePauseActivity通知Launcher进入Paused状态。prev.app.thread是一个ApplicationThread对象的远程接口,通过调用这个远程接口的schedulePauseActivity来通知Launcher进入Paused状态。

ApplicationThreadProxy.schedulePauseActivity这个函数。就是Binder进程间通信机制

接下来进入到ApplicationThread.schedulePauseActivity。

ActivityManagerService就分析到这里。

时间: 2024-08-05 07:07:15

ActivityManagerService是如何启动app的相关文章

Android在浏览器启动APP

要想在浏览器启动APP的方法例如以下: 在须要跳转的ACTIVITY中加入intent-filter的相关信息: <intent-filter> <data android:scheme="com.example.scheme" /> </intent-filter> 实比例如以下: <activity android:name=".BrowActivity" > <intent-filter> <a

Appium学习路—脚本篇(启动app)

启动之前的准备 1.脚本执行前,需要先启动appium的server端, 启动server方法: 打开appium客户端,点击右上角的Launch 2.iOS的测试只能在mac本上做 一.Android启动app python启动脚本如下:   from appium import webdriver desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '4.4'

android chrome iframe设置src属性无法启动app

0x01 Android Intents with Chrome Android有一个很少人知道的特性可以通过web页面发送intent来启动apps.以前通过网页启动app是通过设置iframe的src属性,例如: <iframe src="paulsawesomeapp://page1"> </iframe> 此方法适用version 18或者更早版本.其他android浏览器也适用. 这个功能在安卓chrome 浏览器version 25之后版本发生了改变

Appium + python自动化 - 启动app

各种百度将Appium + python的环境搭建好后,开启移动app自动化的探索(基于Android),首先来记录下如何启动待测的app吧! 如何启动app呢?首先要获取包名,然后获取launcherActivity.获取这两个关键东西的方法有很多,在这里推荐一个sdk自带的实用工具aapt:aapt即Android Asset Packaging Tool,在SDK的build-tools目录下.该工具可以查看apk包名和launcherActivity,当然还有更多的功能,有兴趣的可以查看

外部程序启动App

第一种:直接通过包名: Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.joyodream.jiji"); startActivity(LaunchIntent); 第二种:通过自定义的Action Intent intent = new Intent(); intent.setAction("com.joyodream.jiji.main"); MainActivit

appium+Python 启动app(一)

当我们appium和Python环境都配置好了,如何启动我们第一个app呢?下面介绍appium+Python启动app的操作步骤,为了能够详细查看,我们这里使用夜游神模拟器进行示范. 测试项目:QQ 测试工具:appium.pycharm.夜游神模拟器 操作介绍: 第一步:打开我们的夜游神模拟器,然后我们的电脑上的运行(win+R),输入我们的cmd.当前是先确认我们的设备是否连接到电脑,真机连接方法同样 输入:adb devices A:如果显示下面操作,表示当前设备连接成功 B:如果连接失

7.0 启动app权限弹窗问题

这里提供两种解决方案! 1.安卓6.0+是可以直接利用uiautomator定位元素点击!这个不细说,定位方式很多种...这个等待时间大家自己定大概两到三秒即可! #安卓6.0+点击方式driver.find_element_by_android_uiautomator('new UiSelector().textContains("允许")') 但是一般来说弹窗大多数都是好多个---利用显示等待:启动app之后,在三秒内  没0.5秒寻找一次元素,如果存在则点击,不存在则报错直接pa

Appium启动app

首先要获取包名,然后获取launcherActivity.获取这两个关键东西的方法很多,这里就不一一多说,小伙伴们可以各显神通.小编这里主要给大家推荐一个sdk自带的实用工具aapt. aapt即Android Asset Packaging Tool,在SDK的build-tools目录下.该工具可以查看apk包名和launcherActivity,当然还有更多的功能,有兴趣的可以查看相关资料. 一.下载aapt 1.在android-sdk里面双击SDK-manager,下载buidl-to

python_appium_模拟器启动app进行登录

#coding=utf-8from appium import webdriverimport timedesired_caps = {} #列表desired_caps['platformName'] = 'Android' #安卓的desired_caps['platformVersion'] = '6.0' #安卓版本desired_caps['deviceName'] = 'Android Emulator' #模拟器Emulatordesired_caps['appPackage']