Android-应用启动过程
2017-06-07 23:40
288 查看
一.在桌面或抽屉显示应用图标
桌面或抽屉就是一个普通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{ // 监控应 4000 用与系统的交互 // 创建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应用的启动过程
- Android开发环境搭建和项目各文件介绍应用安装和启动过程
- Android应用的启动的过程
- Android系统应用层App启动过程分析
- Android 应用的安装与启动过程(学习笔记)
- android(二)、 应用启动过程
- Android 系统启动时 PackageManagerService 对应用组件信息表的构建过程
- Android应用框架之应用启动过程
- android 应用启动过程解析
- 源码分析Android 应用进程的启动过程
- cocos2d-x_Android应用启动调用过程简析
- Android APP启动过程中应用代码的加载
- android应用的启动过程
- 第15章 Android启动过程 [Android应用开发与系统改造实战]
- Android应用启动过程
- Android应用启动过程浅析
- Android 8.0系统源码分析--应用进程启动过程分析
- Android 应用的启动过程
- 【Android源码学习】应用启动过程
- cocos2d-x_Android应用启动调用过程简析