目录

前言

初始化

启动App/Widget

前言

第一次写博客,先来点废话唠叨唠叨。博客这玩意儿,还在上大学的时候老师就建议写一写了,可惜比较懒,一直没有动力去写。然后工作了两三年,现在突然发现以前学过和写过的那些JNI、FFMPEG、OPENGL等,久了不用都快忘光了,有新人问到都不好意思说做过了。所以,想想还是写个博客,做点记录吧,忘了还可以回头翻翻,至少证明我曾经真的做过这么些东西。

最近一年基本都在搞系统应用开发,改最多的就是Launcher3,改改布局、换换风格、修修bug,所以就写写Launcher3的一些东西吧,计划是分几个模块来写,具体再看情况吧。其实没有太多的改动,研究的也不够深入,所以有什么写错的地方望大牛指出,新人也不要太相信了,以免误人子弟。

先大概写写Launcher.java这个类吧。Launcher.java是Launcher里面非常主要的一个类,可以说是Launcher的入口吧。Launcher.java的代码量很多,而且跟各个模块各种交互,具体就不一一分析了,就简单说一下相对独立的功能吧,跟其他模块相关的在其他模块再看了。

初始化

Launcher.java是一个Activity,所以从onCreate()开始分析。

protected void onCreate(Bundle savedInstanceState) {

.....

LauncherAppState.setApplicationContext(

getApplicationContext());

LauncherAppState app = LauncherAppState.getInstance();

LauncherAppState.getLauncherProvider().

setLauncherProviderChangeListener(this);

// Lazy-initialize the dynamic grid

DeviceProfile grid = app.initDynamicGrid(this);

// the LauncherApplication should call this, but in case of Instrumentation it might not be present yet

mSharedPrefs = getSharedPreferences(LauncherAppState.

getSharedPreferencesKey(),Context.MODE_PRIVATE);

mIsSafeModeEnabled =getPackageManager().isSafeMode();

mModel = app.setLauncher(this);

mIconCache = app.getIconCache();

mIconCache.flushInvalidIcons(grid);

mDragController = new DragController(this);

mInflater = getLayoutInflater();

mStats = new Stats(this);

mAppWidgetManager = AppWidgetManagerCompat.getInstance(this);

mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);

mAppWidgetHost.startListening();

// If we are getting an onCreate, we can actually preempt onResume and unset mPaused here,

// this also ensures that any synchronous binding below doesn't re-trigger another

// LauncherModel load.

mPaused = false;

if (PROFILE_STARTUP) {

android.os.Debug.startMethodTracing(

Environment.getExternalStorageDirectory() + "/launcher");

}

checkForLocaleChange();

setContentView(R.layout.launcher);

setupViews();

grid.layout(this);

......

}

首先是初始化了LauncherAppState对象app,LauncherAppState用的是单例模式,里面初始化了LauncherModel和IconCache等对象,并且注册了广播监听器和ContentObserver。然后通过对象app又初始化一些对象。

设置布局launcher.xml,调用setupViews又是一些View的初始化,设置回调监听等。

总之,这里面就是一些初始化的操作。

启动App/Widget

当点击应用或者插件的图标时,会启动对应应用或插件,这一功能就是在Launcher.java里实现的。监听onClick事件,然后根据View的不同类型进行不同处理。总之,启动应用和启动插件这两个操作最终都是调用startActivitySafely方法实现启动。

下面看看startActivitySafely的实现:

boolean startActivitySafely(View v, Intent intent, Object tag) {

boolean success = false;

if (mIsSafeModeEnabled && !Utilities.isSystemApp(this, intent)) {

Toast.makeText(this, R.string.safemode_shortcut_error, Toast.LENGTH_SHORT).show();

return 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;

}

如果mIsSafeModeEnabled为true,即在安全模式下,且当前要启动的应用不是系统允许的应用,则返回false,即不给启动。

不在上面的情况下,那就调用startActivity方法来启动,至于startActivity到底是怎么启动的,那得跟进到framework里去看了,这里就不深入了。

博客搬家:http://www.mosiliang.top/?p=174

以后更新都在自个博客上了,有兴趣的可以关注看看,谢谢!

java Launcher源码_Launcher3源码浅析(5.1)--Launcher.java相关推荐

  1. 【源码阅读计划】浅析 Java 线程池工作原理及核心源码

    [源码阅读计划]浅析 Java 线程池工作原理及核心源码 为什么要用线程池? 线程池的设计 线程池如何维护自身状态? 线程池如何管理任务? execute函数执行过程(分配) getTask 函数(获 ...

  2. React Native Android 源码框架浅析(主流程及 Java 与 JS 双边通信)

    [工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 有了前面<React Native Android 从学车到 ...

  3. java怎么安装manven_Canal——Canal-Adapter源码在IDEA部署运行

    一.下载源码 我这里用的是canal-1.1.4版本 源码结构 client-adapter项目就是本次要部署运行的 源码导入到IDEA中的结构如下: 二.安装配置 找到manven模块中有root的 ...

  4. 【JVM】Java类加载器设计原理(ClassLoader源码解读/ SPI机制/ 绕开双亲委派/ 常见Java虚拟机)

    目录 1. 什么是类加载器 2. 类加载器加载的过程 3. Class文件读取来源 4. 类加载器的分类 5. 那些操作会初始化类加载器 6. 类加载器的双亲委派机制 6.1 双亲委派机制机制的好处 ...

  5. java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  6. java连接mongodb_java连接mongodb源码解读

    用mongdb也大半年了,一直是业务上的逻辑实现了就ok.然而这样并不能进步--因此今天查了查java连接mongodb驱动的源码,搜到的各种信息整合一下,方便以后深入的使用. 先贴连接数据库代码Li ...

  7. java B2B2C Springboot电子商务平台源码-Feign 基本使用

    1. [microcloud-consumer-feign]为了可以使用到 feign 支持,需要修改 pom.xml 配置文件,引入相关依赖包:需要JAVA Spring Cloud大型企业分布式微 ...

  8. java.util.concurrent.locks.Condition 源码

    2019独角兽企业重金招聘Python工程师标准>>> 相关类图: 使用Condition和 object作为条件队列的区别: object: 只能绑定一个内部队列,使用notify ...

  9. java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析

    栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...

最新文章

  1. JAVA开发Web Service几种框架介绍
  2. 【转】不用软件,解压Win8/Win8.1的install.wim文件
  3. 毕业论文 | 信号的抽取与插值技术研究(源代码)
  4. Java知多少(12)运算符
  5. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结
  6. 502无法解析服务器标头_编写下载服务器。 第三部分:标头:内容长度和范围...
  7. parser.add_argument验证格式
  8. 给刚入行的存储工程师10+1点建议
  9. python scapy模块安装_python scapy模块安装与依赖模块
  10. Python学习笔记:过滤N位数并绘制折线图
  11. 12. GD32F103C8T6入门教程-定时器-3路pwm输出
  12. python列表数据写入txt文件_Python将列表数据写入文件(txt, csv,excel)
  13. python scikit learn 关闭开源_Python开源机器学习框架:Scikit-learn六大功能,安装和运行Scikit-learn...
  14. [贴图]博客园T恤男士版
  15. 101113香港游有感
  16. 编程语言学习概要与学习方法
  17. 微信ANDROID版本解析包错误,终于弄明白为什么手机安装软件会出现“解析包出现问题”...
  18. 查看网页是否压缩gzip+编码方式
  19. BZOJ2456mode
  20. php计算素数,质数素数计算器

热门文章

  1. 贪吃蛇代码c语言改分,刚学C语言,想写一个贪吃蛇的代码
  2. 给 Android 研发的一些的建议
  3. jQuery 的属性操作方法
  4. xcode 插件安装路径
  5. 编译hibernate源代码
  6. WordPress Citizen Space插件跨站请求伪造漏洞
  7. Android布局控件之LinearLayout详解
  8. 我的.NET开发环境设置
  9. 语言 ota_小米手表第五次OTA升级:百款新表盘 增加运动语音、振动提醒
  10. tcp之backlog参数