美文网首页
App启动原理

App启动原理

作者: Owen270 | 来源:发表于2021-06-21 10:19 被阅读0次
1.当我们点击app桌面图标的时候,桌面Launcher应用会调用

startActivity---->
startActivityForActivityResult----->
Insrumention(execStartActivity)--->
ActivityManagerProxy(startActivity)--->
Binder通信---->通知ActivityManagerService.

2.ActivityManagerService在收到AMP启动Activity的请求后,会做以下事情:

A:检查Activity的合法性,是否在AndroidManifest.xml清单文件中注册。
B:如果合法,会暂存Activity的信息,通过ActivityStack获取栈顶的Activity,并通知Launcher应用,pause 该Activity 。

C:检查Activity所在的进程是否存在。

2.1.如果Activity所在的进程不存在

A:会调用Process.start() ,通过Socket通信的方式,通知zygote进程,fork一个新进程.
B:载入ActivityThread ,会调用main()方法初始化,在main()方法内部会调用 thread.attach(false, startSeq)--->actachApplication()
B1:判断Application是否存在,如果存在,直接绑定当前的进程,
如果不存在,会调用LoadApk.makeApplication创建一个新的Application,并绑定当前进程。

public static void main(String[] args) {
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");

        // CloseGuard defaults to true and can be quite spammy.  We
        // disable it here, but selectively enable it later (via
        // StrictMode) on debug builds, but using DropBox, not logs.
        CloseGuard.setEnabled(false);

        Environment.initForCurrentUser();

        // Set the reporter for event logging in libcore
        EventLogger.setReporter(new EventLoggingReporter());

        // Make sure TrustedCertificateStore looks in the right place for CA certificates
        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
        TrustedCertificateStore.setDefaultUserDirectory(configDir);

        Process.setArgV0("<pre-initialized>");

        Looper.prepareMainLooper();

        // Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line.
        // It will be in the format "seq=114"
        long startSeq = 0;
        if (args != null) {
            for (int i = args.length - 1; i >= 0; --i) {
                if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
                    startSeq = Long.parseLong(
                            args[i].substring(PROC_START_SEQ_IDENT.length()));
                }
            }
        }
        ActivityThread thread = new ActivityThread();
        thread.attach(false, startSeq);

        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }

        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }

        // End of event ActivityThreadMain.
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        Looper.loop();

        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

2.2.然后AMS服务端这边,会通过ApplicationThreadProxy(ATP)ApplicationThead在服务端的代理类,调用ScheduleLanuchActivity启动Activity,以AIDL通信的方式,通知ApplicationThread启动Activity。
2.3.ApplicationThread ------->通过Handler发送一条LaunchActivity的消息通知ActivityThread,然后ActivityThread会调用

handleLaunchActivity--->performLaunchActivity---->Instrumentation--->newActivity---->callActivityCreate---->callActivityStart--->callActivityResume.----->UI渲染完成。

image.png

相关文章

  • iOS IM启动逻辑梳理及优化

    一、app启动原理 1.app启动分为冷启动和热启动。 App 的启动主要包括三个阶段:main() 函数执行前;...

  • App启动原理

    一、程序启动原理 二、程序启动完整过程: 三、ViewController的生命周期 https://www.ji...

  • APP 启动原理

    Android是基于Linux内核的,当手机启动,加载完Linux内核后,会由Linux系统的init祖先进程fo...

  • APP启动原理

    UIApplication相关 一、 什么是UIApplication? 注意:UIApplication不能手动...

  • App启动原理

    1.当我们点击app桌面图标的时候,桌面Launcher应用会调用 startActivity---->start...

  • App白屏和启动优化的一些思路

    App启动优化 App启动优化原理与技术方案 启动优化 黑白屏问题 启动页面主题设置为图片 启动页面,不要再onC...

  • App启动原理及过程详解+闪屏界面+引导页面

    App启动原理及过程详解 一、APP启动概述在Android 中把在Launch界面点击App图标(或快捷方式图标...

  • 深入理解iOS App的启动过程

    前言 参考资料:深入理解iOS App的启动过程iOS 应用程序启动过程及原理总结iOS:App启动过程详解(不同...

  • iOS App启动原理

    序言:如果让我说在哪家公司待过最开心?肯定是跟炽哥一起共事的公司里最快乐。关键在于炽哥,我们经常会在下班的时候讨论...

  • app启动原理详解

    当用户点击桌面icon的时候,系统准备好了,给App分配进程空间,就好像去酒店开房,但是你又不能直接进入房间,你得...

网友评论

      本文标题:App启动原理

      本文链接:https://www.haomeiwen.com/subject/fooeyltx.html