首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android高级常见面试题解析:说说Activity的启动流程

并告知Zygote进程启动之后,加载ActivityThread这个类的入口main函数,启动完成后返回进程的pid,并向AMS的Handler发送一个延迟消息,为的是要求目标进程启动后,10秒钟内需要向...Zygote端主要逻辑是在runOnce函数,函数内调用Zygote.forkAndSpecialize(...)创建子进程,创建完成之后就分别在父进程和子进程里面做各自的事情 1) 父进程通过hanleParentProc...(pid)把子进程的pid通过Socket发送给AMS 2)子进程调用handleChildProc函数,做一些通用的初始化,比如启用Binder机制;执行应用程序的入口函数,也就是ActivityThread...在attachApplicationLoacked函数里,会调用 ActivityRecord hr = stack.topRunningActivityLocked(null); 其中要明白AMS里面有两个栈...,一个是Launch桌面栈,一个就是非桌面栈mFocusedStack,此处的stack就是mFocusedStack,它会将栈顶的ActivityRecord返回出来,我们的目标Activity早就放置在了栈顶

2.9K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Activity的启动流程

    Process.start("android.app.ActivityThread",)方法会向Zygote发送一个启动进程的请求,并告知Zygote进程启动之后,加载ActivityThread这个类的入口...Process.start方法会去调用startViaZygote(processClass,)函数,这个函数主要做了两件事,一件就是打开通往Zygote的Socket,第二件事就是通过Socket发送启动进程参数...Zygote端主要逻辑是在runOnce函数,函数内调用Zygote.forkAndSpecialize(...)创建子进程,创建完成之后就分别在父进程和子进程里面做各自的事情 父进程通过hanleParentProc...(pid)把子进程的pid通过Socket发送给AMS 子进程调用handleChildProc函数,做一些通用的初始化,比如启用Binder机制;执行应用程序的入口函数,也就是ActivityThread...在attachApplicationLoacked函数里,会调用 ``` ActivityRecord hr = stack.topRunningActivityLocked(null); ``` 其中要明白

    62050

    通过 multiprocessing 实现 python 多进程

    但相比多线程机制,多进程的模式也存在一些缺点和不足: 进程切换更为耗时 进程间通信相比线程间共享的数据更为复杂 3. multiprocessing 提供的方法 multiprocessing 提供的方法...方法 描述 active_children 返回当前进程存活的子进程的列表 cpu_count 返回系统的 CPU 数量,但并不是当前进程可用的数量,len(os.sched_getaffinity(...但是不同的是,这些方法只能由被调用进程的父进程来调用。 4.1. Process 类成员 4.1.1....中 fork — 通过 os.fork() 方法创建子进程,子进程在开始时与父进程完全相同,会继承父进程中的所有资源,只能用于 Unix,是 Unix 系统中的默认方式 forkserver — 启动服务器进程...注意 需要注意的是,在程序中 set_start_method() 不应该被多次调用,不同上下文启动的进程可能是不兼容的,比如使用 fork 上下文创建的锁不能传递给使用 spawn 或 forkserver

    76840

    WPF 使用RPC调用其他进程

    使用方法很简单 如果不想知道具体是怎么做,只想使用,那么请看WPF 封装 dotnet remoting 调用其他进程,欢迎加入dotnet 职业学院任何问题都可以在群里交流 首先创建三个工程,一个工程放其他两个需要使用的库...其中客户端就可以调用服务端,客户端和服务端是两个不同的进程,所以可以跨进程调用。...具体调用这个类的方法在服务端运行,结果通过 tcp 或 http 返回。...那么这个功能的作用是什么?因为 x64 程序不能调用 x86 的库,所以可以用这个方法在 x64 的程序调用其他平台的库,因为进程运行的平台不一样,但是通信是相同。...抛出异常 如果不想知道那么多,想要快速开始,请看 WPF 封装 dotnet remoting 调用其他进程 ?

    96710

    Android框架简介--Activity--Activity启动

    基本上在application和activity的所有生命周期调用中,都会先调用instrumentation的相应方法。Instrumentation另一个重要作用是提供Android组件单元测试。...; } ActivityManager.getService().startActivity 这一步会通过binder的方式调用到AMS的接口 第二步 收集应用信息,pause ActivityA...Zygote启动完进程后会返回一个pid,这个pid包含在startResult里面,接着会将pid和app 放入mPidsSelfLocked, 并发送一个延时消息,如果ActivityThread在一定的...,即我们要启动的activity,虽然之前activity没启动,但ams里面栈的信息在启动进程前都已经准备好了。..., "LAUNCH_ACTIVITY"); } break; getPackageInfoNoCheck 会去loadApk加载apk的一些信息,后面启动activity

    72310

    dotnet core 在 MAC 系统下删除应用程序自己后调 Process Start 方法将会抛出 Win32 异常

    在 MAC 系统下,如果在运行过程中,应用程序的文件被删除了,那么此时如果应用程序执行了 Process.Start 方法时,将会抛出 Win32Exception 异常 我写了一个工具 dotnetCampus.UpdateAllDotNetTools...更新 dotnetCampus.UpdateAllDotNetTools 到最新版本之后,其他的 dotnet tool 就都不能更新了,将会抛出 Win32Exception 异常,如下图 ?...在更新 dotnetCampus.UpdateAllDotNetTools 将会删除当前运行的 dotnetCampus.UpdateAllDotNetTools 进程的文件,在 MAC 下是可以删除正在运行的程序的文件...,但是在 .NET Core 的 Process.Start 方法里面的逻辑是需要先获取当前进程所在的文件,获取对应的文件夹,用于找到命令 例如我输入了 dotnet 命令,通过 Process.Start...调用一个和 Windows 的 P/Invoke 方法差不多的方法 /// Gets the path to the current executable, or null

    82730

    【Android开发高级系列】Android多进程专题

    e) {             ......         }     }     ...... }          它调用了Process.start函数开始为应用程序创建新的进程,注意,它传入一个第一个参数为...回到Process.start函数中,它调用startViaZygote函数进一步操作。 Step3. ...,这个函数会创建一个进程,而且有两个返回值,一个是在当前进程中返回的,一个是在新创建的进程中返回,即在当前进程的子进程中返回,在当前进程中的返回值就是新创建的子进程的pid值,而在子进程中的返回值是0。...preload的资源主要是Framework相关的一些基础类和Resource资源,而这些资源正是所有应用都需要的:         开发者通过Android SDK开发应用所调用的API实现都在Framework...在ActivityManagerService中,调用Process.start的地方是下面这个方法: private final void startProcessLocked(ProcessRecord

    36220

    Python笔记:多线程与多进程简介

    总之,灵活地使用多线程以及多进程可以大幅地提升程序的运行效率,尤其是针对爬虫或者线上模型调用等场景。因此,在我们的实际工作中,多线程与多进程无疑是一个非常常用的工具。...最简单的多线程的实现可以由以下几个部分构成: 定义线程所需要进行的作业; 创建一个线程; 启动一个线程; 但是,需要注意的是,线程的创建仅仅是发送了一个开始信号,与主线程是分离的,因此,主线程在发送了启动命令之后可以直接开始后续的代码执行...因此,大多数情况下,我们需要额外加入一个合并操作将子线程合并到主线程当中,此时主线程将会等到子线程运行完毕之后才会开始后续的代码执行。...多线程中队列的使用 如前所述,线程是独立于主线程的,即使我们可以通过join方法将其合并到主线程当中,事实上,我们也无法从中获取任何的返回结果。...如果对于保序有需求,我们需要通过一些其他的手段对其进行额外的保证。 4. 多线程中锁的应用 最后,我们来看一下多线程中线程锁的应用方法。

    41620

    WPF 封装 dotnet remoting 调用其他进程

    本文告诉大家一个封装好的库,使用这个库可以快速搭建多进程相互使用。 在 WPF 使用RPC调用其他进程 已经告诉大家调用的原理,但是大家可以看到,如果自己写一个框架是比较难的。...现在 WPF 可以开始调用 C++ 程序,使用下面的代码进行管理 /// /// 管理其他进程 /// public class...Invoke(sender, e); //即使被你退出了,我还是要启动,但是可能存在一些地方使用的变量放在本地,所以拿到的值就是之前的应用,还是需要用户重启...从上面代码可以看到,这里使用的连接是 IPC ,因为调用其他进程是在同一个电脑,所以这时使用 IPC 的效率会比 http 和 tcp 高。...而使用 http 或 tcp 需要把信息发送给本地巡回,然后再返回。而且使用 http 需要做额外的过程,需要走 http 的协议。使用 tcp 需要使用握手,性能都比 IPC 差。

    89510

    WPF 封装 dotnet remoting 调用其他进程

    本文告诉大家一个封装好的库,使用这个库可以快速搭建多进程相互使用。 在 WPF 使用RPC调用其他进程 已经告诉大家调用的原理,但是大家可以看到,如果自己写一个框架是比较难的。...现在 WPF 可以开始调用 C++ 程序,使用下面的代码进行管理 /// /// 管理其他进程 /// public class...Invoke(sender, e); //即使被你退出了,我还是要启动,但是可能存在一些地方使用的变量放在本地,所以拿到的值就是之前的应用,还是需要用户重启...从上面代码可以看到,这里使用的连接是 IPC ,因为调用其他进程是在同一个电脑,所以这时使用 IPC 的效率会比 http 和 tcp 高。...而使用 http 或 tcp 需要把信息发送给本地巡回,然后再返回。而且使用 http 需要做额外的过程,需要走 http 的协议。使用 tcp 需要使用握手,性能都比 IPC 差。

    84510

    WPF 从零开始开发 dotnet Remoting 程序

    本文告诉大家如何不使用框架,从零开始开发一个 dotnet remoting 程序 在我的另一篇博客 WPF 使用RPC调用其他进程 就大概告诉了大家如何在 WPF 使用 dotnet remoting...这里的 RemoteObject 就是放一些在 Native 和 Remote 都需要使用的类。...启动软件 在 Native 启动 Remote 很简单,因为在相同的文件夹,所以使用下面的代码启动 因为 Remote 只是一个控制台项目,为了让用户可以看到 Remote 就需要在主函数添加一些代码...调用方法 在 Native 的界面添加一个按钮,在按钮按下的时候就触发 Remote 的类的函数 这里关于在 Native 的界面添加按钮和按钮事件本文就不说了,因为很简单。...Native 使用的类需要先注册 为了让 Native 和 Remote 通信就需要注册通信 通过 Activator.GetObject 拿到 Remote 的类返回透明代理 在

    85620

    C++ Qt开发:QProcess进程管理模块

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QProcess...当你在使用Qt进行跨平台应用程序开发时,经常需要与外部进程进行交互,这时就可以利用Qt的QProcess模块。...当调用start()执行命令后,我们则可以通过readAllStandardOutput()函数从进程的标准输出中读取所有可用的数据,并将其返回为 QByteArray 对象。...process.start("tasklist", QStringList() 调用readAllStandardOutput函数我们可以将缓冲区内的数据读出并将其放入到一个...,如下图所示;使用此方法我们可以很好的读取到系统中的各种信息,只要能够合理的过滤出想要的字段即可,当需要输出系统信息时我们可以通过process.start("systeminfo")调用系统命令获取到

    59610

    Android12 应用启动流程分析

    最近因为一些需求,需要梳理 Android 应用的启动链路,从中寻找一些稳定的锚点来实现一些特殊的功能。本文即为对应用端启动全过程的一次代码分析记录。...注意 task 和 进程/线程是不同的概念,大多数 task 可以认为是从桌面点击某个应用开始启动,随着不断点击深入打开其他界面,使对应的 Activity 入栈,在点击返回时将当前 Activity...发送给 zygote 进程,通知 zygote 启动新的进程并返回对应的新进程 ID,图示如下: sequenceDiagram %% Process.start participant P as Process...在 ZygoteConnection fork 完成后,父进程中的返回会执行 handleParentProc,子进程的返回会执行 handleChildProc。...之后的流程就和前面进程已存在情况的场景一致了,我们这里就不再分析代码,而是通过动态调试去验证。

    1.3K20

    Python标准库10 多进程初步 (multiprocessing包)

    但在使用这些共享API的时候,我们要注意以下几点: 在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie)。...在多线程中,我们可以比较容易地共享资源,比如使用全局变量或者传递参数。在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过共享内存和Manager的方法来共享资源。...使用Lock同步,在一个任务输出完成之后,再允许另一个任务输出,可以避免多个任务同时向终端输出。...Pipe对象建立的时候,返回一个含有两个元素的表,每个元素代表Pipe的一端(Connection对象)。我们对Pipe的某一端调用send()方法来传送对象,在另一端使用recv()来接收。...另一些进程从Queue中取出,并打印自己的PID以及get()的字符串。 总结 Process, Lock, Event, Semaphore, Condition Pipe, Queue

    84770

    WPF 启动屏幕键盘

    在 Windows 的平板模式下才能自动在获取键盘输入焦点时弹出屏幕键盘,但是 Windows 的屏幕键盘做的粗糙,有时候不会自动开启屏幕键盘,此时需要使用代码辅助 如果是非平板模式,以及系统没有检测到触摸...的版本,详细请看 关于C#中Environment.OSVersion判断操作系统及Win10上的问题 - 夏至千秋 - 博客园 通过 COM 只有 Toggle 方法,也就是如果原本是没有开启的,调用将会开启...IntPtr.Zero) { return false; } // 这里需要 unchecked 因为返回的是...(int) Win32.GetWindowLongFields.GWL_STYLE); // 如果满足了下面的条件就可以判断显示键盘 // 由于有的系统在键盘不显示时候只是多返回一个...10.0.18362 版本,上面判断方法在一些设备上凉凉

    1.3K10

    将 Windows Terminal 作为外部工具集成到其他工具程序代码中

    命令行调用 在应用商店可以下载到 Windows Terminal (Preview),下载安装后,你就可以开始使用 wt 命令了,这可以用来启动 Windows Terminal。...因此,你在任意的命令行工具,甚至是 Win+R 运行窗口,或者开始菜单的搜索中输入 wt 回车就可以运行 Windows Terminal 了。 默认情况下直接打开会进入用户文件夹下。 ?...%__CD__% 之后,如果通过快捷方式直接启动 Windows Terminal,则会看到路径被切换到了 C:\Windows。...不过这不重要,因为即便是选择了用户路径,每次启动也都是要切走的。 工具集成 在了解了以上命令行调用后,工具集成就简单多了,只需要设置好启动 wt 命令,以及设置好工作路径即可。...PowerShell / CMD / Bash 等多种终端到自定义菜单 - walterlv C# 代码调用 使用 C# 代码启动的方法也非常常规,直接 Process.Start 然后设置工作路径即可

    1.4K10
    领券