Android-应用启动过程

作者: lioilwin | 来源:发表于2017-08-27 17:09 被阅读62次

一.在桌面或抽屉显示应用图标

桌面或抽屉就是一个普通APP应用,用于显示所有应用图标
含有以下intent意图的Activity会显示在桌面或抽屉
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

二.点击桌面或抽屉的应用图标


Launcher.java{
    ...
    public void onClick(View v)
        ...         
        // 新建任务栈Stack,用于存放目标应用的Activity
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent)
    }   
}

三.startActivity(...)过程

1.启功目标应用的任务栈Stack

2.通知源应用的主线程ActivityThread-调用Activity的onPause方法

3.调用Process_start创建新进程,加入目标应用主线程ActivityThread,执行main方法


ActivityThread.java{

    // java程序入口
    public static void main(String[] args) {
        ...
        Looper.prepareMainLooper();
        ActivityThread thread = new ActivityThread();
        thread.attach(false);
        // handle处理消息分发
        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }
        // End of event ActivityThreadMain.
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }
}

4.在目标应用主线程中loadClass加载Activity类


Instrumentation.java{ // 监控应用与系统的交互
    // 创建Activity实例对象
    newActivity(...)
    
    // 调用Activity生命周期的各种方法
    callActivityOnCreate(...)
    callActivityOnStart(...)
    callActivityOnReStart(...)
    callActivityOnResume(...)
    callActivityOnPause(...)
    callActivityOnStop(...)
    callActivityOnDestroy(...)
    callActivityOnSaveInstanceState(...)
    callActivityOnRestoreInstanceState(...)
    ...
}
    

5.在Activity类setContentView加载布局


Activity.java{
    attach(...) {
        ...
        // 创建PhoneWindow extends Window类
        mWindow = new PhoneWindow(this, window);
        ...
    }
    
    onCreate(...){
        setContentView(...) 
    }
    
    setContentView(...) {
        getWindow().setContentView(...);
    }
    
    getWindow(){
        return mWindow;
    }
}

PhoneWindow.java{   
    public void setContentView(int layoutResID) {       
        if (mContentParent == null) {
            installDecor();// 初始化父布局mContentParent
        } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            mContentParent.removeAllViews();
        }
        if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
                    getContext());
            transitionTo(newScene);
        } else {
            mLayoutInflater.inflate(layoutResID, mContentParent);
        }
        ...       
    }
    
    public void setContentView(View view) {
        setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
    }
    
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        if (mContentParent == null) {
            installDecor(); // 初始化父布局mContentParent
        } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            mContentParent.removeAllViews();
        }
        if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            view.setLayoutParams(params);
            final Scene newScene = new Scene(mContentParent, view);
            transitionTo(newScene);
        } else {
            mContentParent.addView(view, params);
        }
        ...
    }

    // 初始化父布局mContentParent
    private void installDecor() {
        mForceDecorInstall = false;
        if (mDecor == null) {
            mDecor = generateDecor(-1);
            mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
            mDecor.setIsRootNamespace(true);
            if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) {
                mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);
            }
        } else {
            mDecor.setWindow(this);
        }
        if (mContentParent == null) {
            mContentParent = generateLayout(mDecor);
            ...
        }       
    }
    
    protected ViewGroup generateLayout(DecorView decor) {
        ...
        ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);
        ...
        return contentParent;
    }
}

简书: http://www.jianshu.com/p/30f61733fdaf
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/72905465
GitHub博客:http://lioil.win/2017/06/07/Android_Launcher.html
Coding博客:http://c.lioil.win/2017/06/07/Android_Launcher.html

相关文章

  • Android-应用启动过程

    一.在桌面或抽屉显示应用图标 二.点击桌面或抽屉的应用图标 三.startActivity(...)过程 1.启功...

  • Android——AMS

    系统启动流程 App启动过程 AMS系统启动过程 应用启动的整体概念 应用程序启动涉及的进程间通信 Activit...

  • 2018-09-06

    本文重点介绍应用程序的启动过程,应用程序的启动过程实际上就是应用程序中的默认Activity的启动过程,本文将详细...

  • 启动时间

    启动共分两种,分别为冷启动、热启动 冷启动:应用首次启动并占用资源的过程 热启动:应用程序切后台回前台的过程 监控...

  • Android四大组件的工作过程

    一、Activity启动过程 应用冷启动过程: Launcher进程通过Binder机制通知AMS创建应用 AMS...

  • iOS技能总结篇

    一、UI原理分析及高级应用 1 App启动过程 1.1 应用的启动过程 1.2 UIWindow的理解及应用 1....

  • 应用的启动过程以及handler,MessageQueue,Lo

    android应用是由activity组成的,应用的启动过程其实就是某个activity的启动过程,是哪个acti...

  • APP进程启动过程

    应用程序进程启动过程,Android7.0为例。 应用程序进程,启动应用程序从启动应用程序进程开始。点击应用程序启...

  • Android-系统启动过程

    参考:http://blog.jobbole.com/67931/ 介绍 一.加载引导 二.引导系统 三.启动内核...

  • android 应用启动流程分析(一)

    android 启动应用启动过程 1. applist 中点击应用 iconClickListener对象是从la...

网友评论

    本文标题:Android-应用启动过程

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