Activity的启动

Activity 启动模式 Flag FLAG_ACTIVITY_NEW_DOCUMENT FLAG_ACTIVITY_MULTIPLE_TASK FLAG_ACTIVITY_RETAIN_IN_RECENTSFlagFLAG_ACTIVITY_NEW_DOCUMENT 此处document 这个单词实在是不知道怎么翻译才恰当,document 本意就是文档,文件的意思,本文展示就翻译成文档的意思吧,我觉得这样稍微准确一点 阅读详情

Activity启动分为很多种情况,这里说的是打开新的应用程序第一个Activity的流程。

1. AcitivityManager产生新进程,新进程从android.app.ActivityThread.main开始运行。这里就是一般意义上的程序入口点,类似于C的main函数。

ActivityManagerService.java

private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr) {

// Process里面通知Zygote服务,Zygote真正产生新的进程(准确说是复制一个)

int pid = Process.start("android.app.ActivityThread",
mSimpleProcessManagement ? app.processName : null, uid, uid,

}

2.ActivityThread的main函数中将Looper准备起来,prepareMainLooper标志着这是应用程序主线程的Looper对象。

ActivityThread.java

public static final void main(String[] args) {

Looper.prepareMainLooper();

ActivityThread thread = new ActivityThread();
thread.attach(false);
// 这里闭合消息循环
Looper.loop();

}

3. 接下来调用attach,参数为false,表明这不是系统进程,是给普通应用程序用使用的进程。

ActivityThread.java

private final void attach(boolean system) {

ViewRoot.addFirstDrawHandler(new Runnable() {
public void run() {
ensureJitEnabled();
}
});
RuntimeInit.setApplicationObject(mAppThread.asBinder());
IActivityManager mgr = ActivityManagerNative.getDefault();
mgr.attachApplication(mAppThread);

}

mAppThread是ApplicationThread对象,是提供给ActivityManagerService控制ActivityThread的回调接口。

private final class ApplicationThread extends ApplicationThreadNative {

public final void schedulePauseActivity(IBinder token, boolean finished,boolean userLeaving, int configChanges){

queueOrSendMessage(finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
token, (userLeaving ? 1 : 0), configChanges);
}

public final void scheduleStopActivity(IBinder token, boolean showWindow, int configChanges) {
queueOrSendMessage(showWindow ? H.STOP_ACTIVITY_SHOW : H.STOP_ACTIVITY_HIDE,
token, 0, configChanges);
}

.........

}

ActivityManagerService要Pause当前Activity,就会调用schedulePauseActivity想本地的消息循环中加入一个H.PAUSE_ACTIVITY的消息,然后立即返回以避免ActivityManagerService的阻塞。

4.现在又回到了ActivityManagerService中

ActivityManagerService.java

// ActivityManagerService中XXXLocked函数才是真正干活的地方,XXX只是个套

public final void attachApplication(IApplicationThread thread) {
int callingPid = Binder.getCallingPid();
attachApplicationLocked(thread, callingPid);
}

private final boolean attachApplicationLocked(IApplicationThread thread, int pid) {

// 这里取出对应该Pid的ProcessRecord对象,如果取不出来,你就等着out吧

app = mPidsSelfLocked.get(pid)

// 为ProcessRecord对象补充信息

app.thread = thread;
app.curAdj = app.setAdj = -100;
app.curSchedGroup = Process.THREAD_GROUP_DEFAULT;
app.setSchedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
app.forcingToForeground = null;
app.foregroundServices = false;
app.debugging = false;
// 清除timeout监测
mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);

// 回调之前的ActivityThread,让它记住自己在ActivityManagerService中的相关信息,传这么大坨东西,真给力

thread.bindApplication(processName, app.instrumentationInfo != null
? app.instrumentationInfo : app.info, providers,
app.instrumentationClass, app.instrumentationProfileFile,
app.instrumentationArguments, app.instrumentationWatcher, testMode,
isRestrictedBackupMode || !normalMode,
mConfiguration, getCommonServicesLocked());

// topRunningActivityLocked的意思没看太明白

HistoryRecord hr = topRunningActivityLocked(null);

// 启动Activity

realStartActivityLocked(hr, app, true, true);

}

private final boolean realStartActivityLocked(HistoryRecord r,
ProcessRecord app, boolean andResume, boolean checkConfig){

// 这里又跑到ActivityThread中去了

app.thread.scheduleLaunchActivity(new Intent(r.intent), r,
System.identityHashCode(r),
r.info, r.icicle, results, newIntents, !andResume,
isNextTransitionForward());

}

5.ActivityThread开始调度用户的Activity启动了

ActivityThread.java

private final void handleLaunchActivity(ActivityRecord r, Intent customIntent) {

}

 

 

来自:http://blog.youkuaiyun.com/dragondog/archive/2011/03/09/6234972.aspx

Activity的四种启动模式 Activity的启动模式可在项目的配置文件内进行设置 standard:标准模式下每次启动的Activity都会新建,切放到Task任务栈的栈顶,通过点击返回关闭应用的话,就需要返回Activity的新建次数 singleTop:相较于standard模式,singleTop模式下,当新建Activity时,首先会确定该Activity是否在该Task的顶部。如果不在的话才会新建 singleTask: 相较于singleTop模式,singleTask模式下,新建Activity时首先会判断其是否 阅读详情

相关推荐

Activity启动过程详解

1. 简介 本文源码基于android 27。 startActivity的流程较复杂,我们这里将其过程分成三部分: startActivity–>ActivityManagerService ActivityManagerService–>ApplicationThread ApplicationThread–>Activity 这样看起来稍微简单点。 通

四月葡萄的博客 2727

Activity 的启动流程(Android 13)

Activity 的启动过程分为两种:一种是普通 Activity 的启动过程,另一种是根 Activity 的启动过程。普通 Activity 指的是除应用程序启动的第一个 Activity 之外的其他 Activity。

xingyu19911016的博客 2万+

Activity的启动流程分析

Activity是Android应用程序的四大组件之一,负责管理Android应用程序的用户界面,一般一个应用程序中包含很多个Activity,他们可能运行在一个进程中,也可能运行在不同的进程中。 我们主要通过启动在不同进程中的Activity,来分析Activity的启动流程及AMS对Activity的管理逻辑。 有两个应用程序App1和App2,在App1的Activity A

zhenjie.Chang的专栏 2485

Activity启动流程

前言 Activity启动流程分两种 一种是启动正在运行的app的Activity,即启动子Activity。如无特殊声明默认和启动该activity的activity处于同一进程。如果有声明在一个新的进程中,则处于两个进程。 另一种是打开新的app,即为Launcher启动新的Activity。 后边启动Activity的流程是一样的,区别是前边判断进程是否存在的那部分。 涉及到的进程 Launcher所在的进程 AMS所在的SystemServer进程 要启动的Activity所在的app

qq_36191896的博客 5624

HAL库移植实战:解决‘HAL_StatusTypeDef‘未定义报错的3个关键步骤

本文针对STM32开发中从标准库向HAL库移植时常见的'HAL_StatusTypeDef'未定义报错,提供了三个关键解决步骤:首先确保正确包含头文件入口,其次检查并配置模块使能宏,最后注意避免与标准库的同名结构体混用。文章通过实战案例解析了HAL库的模块化设计理念,帮助开发者高效解决混合编程中的编译问题。

book8的博客 207

FastAPI + React:现代 Web 前后端分离开发的全栈实践指南

• 部署:CI/CD 双流水线,前端 push → GitHub Actions → Cloudflare Pages;• 后端:分层结构 routers → services → repositories → models,单测覆盖率 90 %。• 接口缓存:Redis + FastAPI Depends 实现接口级缓存,读 QPS 提升至 5 k。• 前端:BFF 由 React Query 代理,统一缓存、重试、分页。GET /items/{id} 详情。,前端同学无需等 Mock 即可联调。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 1494

解析Activity的启动过程

Activity启动过程 Activity 的启动过程分为两种, 一种是根 Activity 的启动过程,另一种是普通Activity(子Activity)的启动过程。 根Activity:以快捷图标的形式显示在Launcher中,它的启动过程代表了一个Android应用程序的启动过程。 子Activity:由根Activity或其他子Activity启动,他们有可能与启动他们的Activity运行在同一个进程中,也可能运行在不同的进程中。 ...

lixiong0713的博客 2万+

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1093

Activity启动过程

Activity作为Android四大组件中使用最频繁的组件,也是和用户交互最多的组件,可见它在Android技术体系的核心地位,了解Activity的启动过程可以帮助我们更好的了解Android系统和使用Activity。

八归少年 2396

intel-VROC raid卡驱动 centos7.9

u盘进入系统,按e,在出现下面在quiet前面输入inst.dd initcall_blacklist=vmd_drv_init 后按Ctrl和x,开始引导。进入系统,按e,在出现下面在quiet前面输入inst.dd inicll_blacklist=vmd_drv_init 后按Ctrl和x,开始引导。驱动完成后,在输入 c 回车, 引导过程开始,进入安装界面。输入1 ,选择这个ISO驱动文件里的rpm包。输入1 ,选择这个ISO驱动文件里的rpm包。vi编辑 /etc/default/grub。

dacming的博客 4542

【电驱动】永磁同步电机工作原理及分类

永磁同步电机工作原理及分类

星Yeah 的博客 7329

Activity的启动流程,如何判断当前activity所在进程已经启动了

startActivity启动过程分析 https://blog.youkuaiyun.com/luoshengyang/article/details/6689748 看完这两篇干货,应该一清二楚了。 是否启动应用进程的分支在ActivityStackSupervisor#startSpecificActivityLocked方法内部 通过判断当前activity对于的进程名的ProcessRecord是否存在来判断进程是否启动(android-cts-7.1_r20 tag) public fin.

网鱼的栈 2083

ubuntu18.04 升级Ubuntu 20.04

Ubuntu 18.04升级20.04指南:首先备份重要数据,更新当前系统并检查新版本可用性(sudo do-release-upgrade -c)。确认升级后执行sudo do-release-upgrade,按提示完成操作。升级过程需耐心等待,完成后重启系统。注意:升级前务必备份数据,确保系统为最新版本,以降低风险。升级后即可使用Ubuntu 20.04系统。

https://ophome.blog.youkuaiyun.com,在IT行业有多年的工作经验,尤其是在Python、Linux、负载均衡、Nginx和服务器运维等领域。 1058

Activity(一)—— Activity的启动流程

Activity的启动流程 1.1 根Activity的启动流程 点击桌面APP图标,Launcher进程采用Binder IPC的方式向system_server进程的AMS(ActivityManagerService)发起startActivity的请求。 system_server进程接收到请求后,采用Socket IPC向Zygote进程发出创建APP进程的请求; Zygote进程fork出新的进程,即APP进程; APP进程通过Binder IPC向system_server进程发起attac

xingyu19911016的博客 8820

ThinkBook 16 2024 Ubuntu驱动全攻略:从无线网卡到触控板

本文详细介绍了ThinkBook 16 2024在Ubuntu系统下的驱动问题解决方案,涵盖无线网卡、蓝牙、显卡和触控板等关键硬件的驱动修复步骤。通过具体命令和配置指南,帮助用户快速解决兼容性问题,提升Ubuntu在ThinkBook上的使用体验。

weixin_29200741的博客 829

STM8开发环境搭建(STVD + COSMIC)

一、STM8开发IDE 1. STVD + COSMIC ST Visual Develop (STVD)只支持汇编开发,C语言开发需要再安装COSMIC,配套起来使用。 2. IAR IAR也可以用来开发STM8 下面介绍STVD + COSMIC的搭建方式 二、环境搭建 1. STVD下载、安装 直接从官网下载:https://www.st.com/en/development-tools/stvd-stm8.html 安装很简单,基本下一步往下点。 2. COSMIC下载、安装 对于stm8可以使用3

a183635870的博客 1万+

Service 中启动 Activity

在 Service 中启动 Activity,有很多方式,比如隐式启动、显式启动等。 隐式启动 Activity,需要在manifest.xml 中为该 Activity 配置 ,如下所示: activity android:name=".MyActivity" >           intent-filter>               actio

comeoverjava的专栏 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Activity 启动过程

这边会去掉关于启动进程 Launcher、孵化进程 Zygote 等有关的篇幅。进入主题吧当我们在面试的时候被问及,我们应该怎么回答呢?根 Activity 的启动流程普通 Activity 的启动流程,这边总结下。

hqb112233的博客 1758

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Activity 启动流程

Activity 启动的整体流程 普通 Activity 的启动 普通 Activity 的启动就是通过调用 startActivity 函数启动一个新的 Activity。总体流程如下图: 其中涉及了两个进程,App 进程和 AMS 进程。整体步骤是: 启动者 Activity 向 Instrumentation 请求启动目标 Activity; Instrumentation 通过 AMS 在 App 进程的 IBinder 接口(IActivityManager),访问 AMS,此时 A

qq_41821190的博客 2462

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

浅谈Activity启动流程

概述 Activity的启动方式有两种,一种是显式的,一种是隐式的。 而且,启动的Activity和原Activity的进程关系的不同又可以分为两种情况,一种是在同一个进程,另外一种情况是开启一个新的进程来启动Activity。 Activity启动之前的一些事情 init进程:init是所有linux程序的起点,是Zygote的父进程。解析init.rc孵化出Zygote进程。 ...

诺诺诺诺诺诺诺诺的博客 1万+

图解Activity的启动过程

由于Activity的启动涉及大量IPC和Binder方面的知识,因此了解这方面的知识后再来看Activity启动的相关源码可能不会那么吃力。

TellH的博客 6549

从启动模式为singleInstance的Activity启动到默认情况的Activity

Activity的启动模式 standard(默认) 1)每次使用startActivity方法启动Activity时 都会创建该Activity的新实例 2)Activity的多个实例可以位于同一个task中 也可以分布在不同的task里 3)在当前task中使用startActivity方法启动Activity 也在当前task中创建和运行 single

Twofish 2177
上一篇: Android 系统核心或驱动的开发之Android repo 魔法
下一篇: android binder机制实现
lb015331
博客等级 码龄19年 22粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值