【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用启用普通安卓应用 | 应用进程分析 )
文章目录
- 一、 Launcher 应用 startActivitySafely 方法分析
- 二、 Launcher 中的 startActivity(View v, Intent intent, Object tag) 方法分析
- 三、 Android 应用进程分析
上一篇博客 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用简介 | Launcher 应用源码简介 | Launcher 应用快捷方式图标点击方法分析 ) 分析了 Launcher 应用中 Launcher.java 界面代码 , 并分析了图标点击事件 onClick 方法 , 本篇博客继续分析 Launcher 应用中启动普通 Android 应用的源码 ;
一、 Launcher 应用 startActivitySafely 方法分析
在 Launcher 应用中 , 点击快捷方式图标 , 调用 onClick 方法 , 如果判定点击的图标组件时应用图标 , 会触发调用 startActivitySafely 方法 , 启动该图标对应的 Android 应用 Activity 界面 ;
boolean startActivitySafely(View v, Intent intent, Object tag) {boolean success = false;try {// 启动新的应用success = startActivity(v, intent, tag);} 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;}
该段代码在 \packages\apps\Launcher2\src\com\android\launcher2\Launcher.java 界面中定义 , 该界面是 Launcher 应用的主界面 ;
二、 Launcher 中的 startActivity(View v, Intent intent, Object tag) 方法分析
1 . Launcher 中的启动方法 : Launcher 应用中启动 Android 应用 , 调用 startActivity(View v, Intent intent, Object tag) 方法 , 在该方法中 , 启动 Android 应用的启动 Activity ;
3 . 实际启动方法 : 在 startActivity(View v, Intent intent, Object tag) 方法中启动 Android 应用的核心方法是 startActivity(intent, opts.toBundle()) 和 startActivity(intent) 启动安卓应用界面 ;
( 该 startActivity(intent) 方法就是我们经常调用的启动界面的方法 )
4 . Intent 来源 : 该启动 的 Intent 参数是之前 onClick 方法中从 Launcher 中的图标组件中获取的 Tag 标签 ;
public void onClick(View v) {// 该从 View v 组件中获取的标签 Tag 就是 IntentObject tag = v.getTag();if (tag instanceof ShortcutInfo) {// 获取 Intent 对象 , 可以直接根据该对象启动应用 Activity 界面final Intent intent = ((ShortcutInfo) tag).intent;}
}
5 . Launcher 应用中 startActivity(View v, Intent intent, Object tag) 方法源码 :
boolean startActivity(View v, Intent intent, Object tag) {// 设置一个启动标志// 查找当前任务栈中是否有与该 Activity 亲和性相同的任务栈// 如果有将该任务栈移动到前台 , 至于是创建新 Activity 还是复用原来 Activity , 按照该 Activity 的启动模式进行操作// 如果没有亲和性相同任务栈 , 创建任务栈 , 移动到前台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);UserHandle user = (UserHandle) intent.getParcelableExtra(ApplicationInfo.EXTRA_PROFILE);LauncherApps launcherApps = (LauncherApps)this.getSystemService(Context.LAUNCHER_APPS_SERVICE);if (useLaunchAnimation) {ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(v, 0, 0,v.getMeasuredWidth(), v.getMeasuredHeight());if (user == null || user.equals(android.os.Process.myUserHandle())) {// Could be launching some bookkeeping activity// 根据 Intent 启动点击图标对应的 Activity 界面startActivity(intent, opts.toBundle());} else {launcherApps.startMainActivity(intent.getComponent(), user,intent.getSourceBounds(),opts.toBundle());}} else {if (user == null || user.equals(android.os.Process.myUserHandle())) {// 真实启动应用的方法// 根据 Intent 启动点击图标对应的 Activity 界面startActivity(intent);} else {launcherApps.startMainActivity(intent.getComponent(), user,intent.getSourceBounds(), null);}}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;}
该段代码在 \packages\apps\Launcher2\src\com\android\launcher2\Launcher.java 界面中定义 , 该界面是 Launcher 应用的主界面 ;
三、 Android 应用进程分析
1 . 应用启动前置操作 : 调用 startActivity(Intent intent) 方法 , 通过进程间通信 , 启动另外的 Android 应用 , 首先会去查找该 Activity 对应的包名 , 为该应用分配内存空间 , 并加载新应用对应的 main 函数 , 通过 Zygote 进程 , 孵化出新进程 , 在新进程中有方法区 , 堆区 , 栈区 , 等内存分区 ;
2 . 创建新进程过程 : Launcher 应用与 Zygote 进程进行通信后 , 通知 Zygote 进程 fork 一个新的进程 , 该新进程中通过 System Server 执行 ActivityThread , 执行 ActivityThread 中的主函数 ;
该 ActivityThread 中的主函数 main 中 , 有一个 Looper 不停的在不停的轮询读取 MessageQueue 中的消息 , 用于接收指令执行应用相关操作 ;
3 . 创建进程依据 : 根据包名查找创建进程 ;
① 根据包名查找创建进程 : 这个 ActivityThread 是指定包名的应用的函数入口 , 不是一个随意的入口 , 需要根据该包名查找对应的进程是否已经存在 ;
② 进程不存在 : 如果这个进程不存在 , 需要重新 fork 进程 , 执行后续一系列操作 , 那么这次启动称为冷启动 ;
③ 进程存在 : 如果之前该包名对应的应用存在 , 不需要重新创建进程 , 进程可以直接复用 , 那么这次启动称为热启动 ;
4 . 从进程角度分析冷启动与热启动 :
① 冷启动 : 运行程序后 , 应用启动 , 会为该应用启动一个新进程 ; 这次启动是冷启动 ;
② 退出应用 进程保留 : 点击回退键 , 应用退出 , 此时该进程进入后台 , 不会马上被杀死 ;
③ 热启动 : 再次启动该应用时 , 就会重新启用之前的进程 , 这次启动就是热启动 ;
这也是安卓手机为什么越用越卡的原因 , 进程进入后台 , 没有及时杀死 ; 苹果手机进程进入后台 , 会放入一个与运行时不相关的内存中 ;
【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用启用普通安卓应用 | 应用进程分析 )相关推荐
- 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用简介 | Launcher 应用源码简介 | Launcher 应用快捷方式图标点击方法分析 )
文章目录 一. Launcher 应用简介 二. Launcher 应用源码简介 三. Launcher 图标点击方法分析 一. Launcher 应用简介 Launcher 应用 : Android ...
- 抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建。
前言:抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建. 抖音seo源码如何搭建?抖音seo排名优化系统软件部分源码分析,代码打包中... 场景:在 python 中,你可以使用 list[1 ...
- 【优化求解】基于matlab禁忌搜索算法求解函数极值问题【含Matlab源码 1204期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [优化求解]基于matlab禁忌搜索算法求解函数极值问题[含Matlab源码 1204期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...
- 【Matlab风电功率预测】麻雀算法优化LSSVM风电功率预测(多输入单输出)【含源码 1718期】
一.代码运行视频(哔哩哔哩) [Matlab风电功率预测]麻雀算法优化LSSVM风电功率预测(多输入单输出)[含源码 1718期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 ...
- 【优化算法】基于matlab反向策略的麻雀搜索算法【含Matlab源码 1918期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]基于matlab反向策略的麻雀搜索算法[含Matlab源码 1918期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式 ...
- 【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )
文章目录 一.ClassLoader 源码简介 二.BaseDexClassLoader 源码简介 三.DexClassLoader 源码简介 四.PathClassLoader 源码简介 五.InM ...
- 【附源码】计算机毕业设计Python安卓电影购票app设计与实现wx4x1(源码+程序+LW+调试部署)
[附源码]计算机毕业设计Python安卓电影购票app设计与实现wx4x1(源码+程序+LW+调试部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Pytho ...
- 《Spark商业案例与性能调优实战100课》第25课:Spark Hash Shuffle源码解读与剖析
<Spark商业案例与性能调优实战100课>第25课:Spark Hash Shuffle源码解读与剖析
- Android 性能监测工具,优化内存、卡顿、耗电、APK的方法
导语 安卓大军浩浩荡荡,发展已近十个年头,技术优化月新日异,如今 Android 9.0 代号P 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得 ...
- Android性能调优 - 稳定性优化
1.你们做了哪些稳定性方面的优化? 随着项目的逐渐成熟,用户基数逐渐增多,DAU持续升高,我们遇到了很多稳定性方面的问题,对于我们技术同学遇到了很多的挑战,用户经常使用我们的App卡顿或者是功能不可用 ...
最新文章
- 《评人工智能如何走向新阶段》后记(再续4)
- 【BLE MIDI】推荐一个 Android 平台开源 MIDI 软件 MidiSheetMusic ( 相关资料 | Android Studio 中导入 Eclipse 源码 )
- 操作系统-并发性:互斥与同步
- 齐次(Homogeneous)、单项式、多项式
- 【Leetocde | 10 】54. 螺旋矩阵
- 区块链人才缺口明年将达顶峰,核心开发者年入百万很正常
- bat 修改txt_善用bat命令提高办公效率
- 微信小程序(12)--倒计时
- Spring Cloud 负载均衡
- 《疯狂的程序员》 -- 什么是真正的程序员?
- 【GitHub】中SSH key的配置
- 微信小程序服务器云端,微信小程序云端解决方案.PDF
- bzoj 3197: [Sdoi2013]assassin 树哈希+树形dp+费用流
- 源码剖析Redis中如何使用跳表的
- 子域名接管_在S3上利用子域接管
- 聚类标准误(cluster standard errors)是什么,什么情况下需要聚类,控制了固定效应(fixed effect)还需要聚类吗?
- 商品房销售价格指数中的同比,环比,定基
- python爬取旅游信息_Python 爬取 13 个旅游城市,告诉你五一大家最爱去哪玩?
- 2021年中国电力行业供需情况分析,市场化改革加速推进「图」
- 基于深度学习算法的语音识别(华为云)