上图为整个Activity的启动流程

接下来我们大概分析

在我们的Android系统中,应用程序是由Launcher这个应用启动起来的。当我们安装好应用程序之后,就会在Launcher的界面上生成一个图标,我们点击图标时Launch就会启动我们的应用程序。

1.点击图标,launcher调用onClick方法

 /*** * * @param v      The view representing the clicked shortcut.  1.此处的view是指被点击的桌面图标*/public void onClick(View v) {// Make sure that rogue clicks don't get through while allapps is// launching, or after the// view has detached (it's possible for this to happen if the view is// removed mid touch).if (v.getWindowToken() == null) {return;}if (!mWorkspace.isFinishedSwitchingState()) {return;}Object tag = v.getTag();if (tag instanceof ShortcutInfo) {// 打开快捷方式对应的intentfinal Intent intent = ((ShortcutInfo) tag).intent;int[] pos = new int[2];v.getLocationOnScreen(pos);intent.setSourceBounds(new Rect(pos[0], pos[1], pos[0]+ v.getWidth(), pos[1] + v.getHeight()));boolean success = startActivitySafely(v, intent, tag);//2.同时调用startActivitySafely
if (success && v instanceof BubbleTextView) {mWaitingForResume = (BubbleTextView) v;mWaitingForResume.setStayPressed(true);}} else if (tag instanceof FolderInfo) {if (v instanceof FolderIcon) {// 打开文件夹FolderIcon fi = (FolderIcon) v;handleFolderClick(fi);}} else if (v == mAllAppsButton) {// 显示或者不显示“全部程序”界面if (isAllAppsVisible()) {showWorkspace(true);} else {onClickAllAppsButton(v);}}}


2.在launcher的onClick方法里调用了startActivitySafely()方法,见上述代码

boolean startActivitySafely(View v, Intent intent, Object tag) {boolean success = false;try {success = startActivity(v, intent, tag);  由此可见StartActivitySafely(),最终是调用startActivity()方法
} catch (ActivityNotFoundException e) {Toast.makeText(this, R.string.activity_not_found,Toast.LENGTH_SHORT).show();Log.e(TAG, "Unable to launch. tag=" + tag + " intent=" + intent, e);}return success;}
 boolean startActivity(View v, Intent intent, Object tag) {intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);try {// Only launch using the new animation if the shortcut has not opted// out (this is a// private contract between launcher and may be ignored in the// future).boolean useLaunchAnimation = (v != null)&& !intent.hasExtra(INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION);if (useLaunchAnimation) {ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(v,0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());startActivity(intent, opts.toBundle());} else {startActivity(intent);}return true;} catch (SecurityException e) {Toast.makeText(this, R.string.activity_not_found,Toast.LENGTH_SHORT).show();Log.e(TAG,"Launcher does not have the permission to launch "+ intent+ ". Make sure to create a MAIN intent-filter for the corresponding activity "+ "or use the exported attribute for this activity. "+ "tag=" + tag + " intent=" + intent, e);}return false;}
3.在startActivity()方法中,intent 添加了flag FLAG_ACTIVITY_NEW_TASK , 此标志为创建新的任务栈,在创建目标
任务栈之前,首先会调用ActivityThread类启动launcher的进程,然后启动目标应用的任务栈,启动完成之后,目标应用的任务栈会通知
ActivityThread调用launcher的onPause方法。此时,ActivityThread启动新的应用进程(也就是目标应用的进程)。

4.目标应用的进程通过loadClass加载MainActivity,然后通过H(handler)来控制MainActivity的生命周期


Android 四大组件之——Acitivity(三) 深入了解Activity的启动流程相关推荐

  1. Android 四大组件之——Acitivity(一)

    一,什么是Activity activity是Android组件中最基本也是最为常见用的四大组件之一.Android四大组件有Activity,Service服务,Content Provider内容 ...

  2. Android 四大组件之——Acitivity(二) 启动模式

    Activity的启动模式共有4种 分别为   standard.singleTop.singleTask.singleInstance : 四种启动模式的配置都在Manifest文件中配置,配置模板 ...

  3. Android四大组件完全解析(一)---Activity

    本文参考\android\android\frameworks\base\core\java\android\app\Activity.java文件中的类注释,以及android/frameworks ...

  4. Android 四大组件之——Acitivity(四) Activity是如何加载显示内容的?

    1. 在Activity调用onCreate()等生命周期之前,Activity会调用attach()方法,而在attach()方法中会调用如下代码 onAttach() {PolicyManager ...

  5. android四大组件的作用简书,Android四大组件是什么

    Android四大组件是:活动.服务.广播接收器.内容提供商.它们的英文名称是ACTIVITY.SERVICE.BroadcastReceiver.Content Provider.四个组件分别起到不 ...

  6. Android 四大组件之——Service(一)

    一.什么是服务 服务,是Android四大组件之一, 属于 计算型组件.   长期后台运行的没有界面的组件 ,特点是无用户界面.在后台运行.生命周期长 二,什么时候使用服务? 天气预报:后台的连接服务 ...

  7. Android——四大组件、六大布局、五大存储

    一.android四大组件 (一)android四大组件详解 Android四大组件分别为activity.service.content provider.broadcast receiver. 1 ...

  8. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  9. Android 四大组件 —— 服务

    一.服务是什么 服务(Service)是Android 中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使当程序被切换 ...

最新文章

  1. java注解返回不同消息,Spring MVC Controller中的一个读入和返回都是JSON的方法如何获取javax.validation注解的异常信息...
  2. 4月17日云栖精选夜读 | 在阿里做了五年技术主管,我有话想说
  3. win10家庭版gpedit.msc无法打开本地组策略
  4. 修改putty远程登录控制台的字体
  5. cubemx lan8720模块_通过STM32cubeMX将STM32F767+LAN8720+LwIP+FreeRTOS的以太网实现
  6. (68)zabbix windows性能计数器使用详解
  7. Java 将一段时间以周、月、季分割
  8. Xcode低版本运行高版本真机(xcode9联调真机iOS12 系统)
  9. 压缩算法之算术编码浅析与实现
  10. 缓存框架 EhCache 使用 4
  11. 首台自主创新全空冷机组在三峡运行,图扑数字孪生机体
  12. 微信公众号数据2019_微信公众号精准数据对比 让公众号运营更顺利
  13. 计算机无法同步,在win7中,为什么电脑时间不能同步?
  14. coreldraw x7如何禁网_出现问题如何修改和修复安装coreldraw x7
  15. python 手机App数据抓取实战一
  16. 将球放入盒中的方法数总结(球盒模型问题)
  17. 上海大学计算机专硕学制,上海大学一月专硕在职读研学制详解
  18. 微信公众号 自定义分享功能
  19. 问道手游平民玩家什么职业好
  20. springboot异步和切面_Spring异步编程 你的@Async就真的异步吗?异步历险奇遇记

热门文章

  1. SD-WAN应用可见性的流量对称
  2. Internet导致业务绩效降低的4个怪原因—Vecloud微云
  3. supervisor的常用命令
  4. [译文]c#扩展方法(Extension Method In C#)
  5. 通过Iframe在A网站页面内嵌入空白页面的方式,跨域获取B网站的数据返回给A网站!...
  6. appium第一个安卓自动化工程
  7. BNF范式(巴科斯范式)简介
  8. Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
  9. songsoft-关于加薪的策略
  10. 107.网络服务质量包括哪些(QoS)