Android-应用启动过程
来源:互联网 发布:股票自动化交易编程 编辑:程序博客网 时间:2024/05/17 21:46
一.在桌面或抽屉显示应用图标
桌面或抽屉就是一个普通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
阅读全文
0 0
- Android应用启动过程
- Android-应用启动过程
- android应用的启动过程
- android应用的启动过程
- Android应用启动过程浅析
- android 应用启动过程解析
- Android应用启动过程浅析
- Android 应用的启动过程
- Android应用框架之应用启动过程
- android学习--Activity及应用启动过程
- android(二)、 应用启动过程
- 【Android源码学习】应用启动过程
- Android应用的启动的过程
- iOS 应用启动过程
- Android 应用的安装与启动过程(学习笔记)
- android应用开机自启动过程研究(迷惑中)
- 源码分析Android 应用进程的启动过程
- 深入理解Dalvik虚拟机- Android应用进程启动过程分析
- ANR&OOM
- python实现换位加密算法
- pm2的那些坑
- Cordova插件开发
- 读取文件内容
- Android-应用启动过程
- 简述装饰模式实现思想
- Android控件三(ProgressBar 进度条)
- Android—常用控件(一)文本控件
- java ftp 文件下载
- cookie和session的思考
- 6月读书《有效的管理者》笔记
- Mac 配置angular-cli环境
- idea之工作流activiti报错is unrecognized or represents more than one time zone.解决方案