前言

Launcher 是系统启动后第一个启动的程序,是其他应用程序的入口,也是我们的手机程序的桌面程序。

设计模式:MVC

目录

  • Launcher
  • LauncherActivity.onCreate
  • LauncherActivity.onResume
  • LauncherActivity.onDestroy

Launcher

通过查看 AndroidManifest 清单文件,我们发现Launcher也是一个Activity,名字叫做“LauncherActivity”.

LauncherActivity.onCreate

  • initConfigure()
  • initView()

    LauncherActivity 继承自 BaseFragmentActivity,BaseFragmentActivity 又继承于 FragmentActivity。

    initConfigure()

我们找到 BaseFragmentActivity : onCreate()中的 initConfigure(bundle),方法中并未做逻辑操控,目前只是把 bundle 作为参数传进来了。在 LauncherActivity 中,重写了该方法。

重写 initConfigure(bundle) 方法中的部分代码:
requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏标题栏,实现全屏效果

为了隐藏 toolbar ,所以 initConfigure() 方法需要在 setContentView(getLayoutID()); 方法前进行调用。

initView()

BaseFragmentActivity 中设置了一个抽象方法,initView() 它们在子类 LauncherActivity 中得以实现。

在这个方法中初始化了 LayoutInflater,自定义 ViewGroup(DragLayer)和多个 View。并且在 LauncherActivity 中以绑定的方式启动后台 Service。

绑定 Service
Intent intent = new Intent(this, GetExtendAppsService.class);intent.setAction(GetExtendAppsService.START_GET_EXTEND_APPS_SERVICE_ACTION);bindService(intent, connection, BIND_AUTO_CREATE);

最后在该方法中进行数据操作的初始化:

获得一个 SharedPreference ,查看 ResendHelper 的代码,不难看出它是一个将本地数据上传服务器的类,内部定义了一个广播接收器,我们在 initView()中调用 ResendHelper.start() 方法,监测网络的变化。

LauncherActivity.onResume

onResume 方法中实现了 callback 回调接口,在onResume调用这个接口,恢复Launcher数据。

关于回调接口,使用的是Java设计模式中的策略模式,通过抽象类和接口将方法的具体实现抽离出来,使用时只需要重写相应的方法。比如 Android 中的点击事件就是回调机制的一个使用最频繁的例子。

    //WorkSpace 的初始状态设置mWorkspace.snapToPage(1, false);mWorkspace.setCurrentPage(1);

snapToPage 方法将会调用父类 PagedViewd 的同名方法,在该方法内根据页码(mCurrentPage)调用 ScreenChangeListener.onScreenChange(whichPage) 进行页面的切换。

接下来发现了一个有趣的类,LauncherModel 它继承自 BroadcastReceiver,这里面有 MissCallAndSMSObserver,通过观察 MissCallAndSMSObserver 的 register()和 onChange() 方法,这不正是我们的观察者模式嘛? 通过订阅注册成为观察者(Observer)当有新消息到达时通过 onChange ()方法更新数据,在这里作者发送了两个广播。

当 DragLayer 还不可见且 welcome(TextView)可见时,我们隐藏 welcome ,下一步就用到了回调接口的 screenOn()方法了:将 WorkSpace 设置为不可见,然后使用 Handler 的 postDelayed() 方法延时50毫秒播放动画等 UI 更新操作,然后重新将 WorkSpace 设置为可见。

其实这部分代码就是负责进入Launcher后桌面图标的动画效果,我们尝试将延时时间设置为5000(5秒),重新编译运行项目发现除了 HotSet 有显示图标,屏幕中部为空,5秒后才有 icon 伴随着动画显示出来,这也验证了我们的思路是正确的。

   //修改代码
mHandler.postDelayed(new Runnable() {// 延时5000毫秒更新 UI@Overridepublic void run() {// TODO Auto-generated method stubhotseatScreenOnAnimator();mDragLayer.unLockAnim();mWorkspace.setVisibility(View.VISIBLE);}}, 5000);

LauncherActivity.onDestroy

LauncherProvider.getIntance(this).destory();
mResendHelper.destroy();

在 onDestroy()方法中关闭相关的资源。

LauncherProvideer 使用了单例模式,使用双检锁的形式实现,双重锁:两次判断,一次加锁。 这种方式采用双锁机制,保证在多线程的环境下不出错。而mResendHelper.destroy() 调用 mContext.unregisterReceiver(mNetChangeReceiver),取消消息订阅实现观察者的注销。

LauncherActivity 项目分析相关推荐

  1. python launcher怎么使用_QMUI实战(一)—为何我们要使用 LauncherActivity?

    QMUI 2 发布了,但是里面换肤等相关的很多东西,如果不讲,那么很多人估计就只能复制粘贴下 QMUIDemo 的代码,而并不能用好 QMUI, 或者是通过 QMUI 来提升自己的 UI 开发能力,毕 ...

  2. 项目分析_xxoo-master

    项目介绍:使用java1.5的原生xml操作类实现 对象<-->xml字符串的相互转化 项目分析:主要分为是三个部分 1.容器类:AbstractContainer   存储xml.obj ...

  3. android 可行性分析,可行性研究项目分析程序与步骤

    项目分析程序 项目分析 分析工作步骤 分析程序框架 分段实施方法 第一阶段初期工作 1.收集资料.包括业主的要求,业主已经完成的研究成果,市场.厂址.原料.能源.运输.维修.共用设 施.环境.劳动力来 ...

  4. 数据仓库项目分析_数据分析项目:仓库库存

    数据仓库项目分析 The code for this project can be found at my GitHub. 该项目的代码可以在我的GitHub上找到 . 介绍 (Introductio ...

  5. winform项目_winform项目——仿QQ即时通讯程序01:原理及项目分析

    即时通讯程序,腾讯QQ可以说是一家独大,虽然市场上仍然有类似QQ的即时通讯程序,但是基本上面向的对象都是特定人群.那么,现在做一个即时通讯的软件还有意义吗?在我看来,意义非常大.作为一个学习编程的人, ...

  6. github开源项目_GitHub项目分析,3D打印义肢和更多开源新闻

    github开源项目 在本周的开源新闻摘要中,我们将介绍GitHub项目分析,3D打印修复技术,微生物组预测算法等等! 2016年6月26日至7月2日的开源新闻摘要 GitHub通过Google Bi ...

  7. 基于MVC的jpetstore项目分析

    下面是基于MVC的jpetstore项目分析:jpetstore: github地址:https://github.com/SwordHarry/Jpetstore 使用环境:IntelliJ IDE ...

  8. BBS(仿博客园系统)项目01(项目分析、表结构设计、注册功能实现)

    摘要: 需求分析 表结构设计 注册功能实现 一.需求分析: 项目需求(产品经理.架构师.开发组组长与客户谈该项目相关要求) 项目设计 (架构师需要思考:框架选择,数据库选择,主要功能模块,报价:包括工 ...

  9. 自由职业者和外包接单项目分析

    自由职业者.威客和外包接单项目快报.万事网根据昨天(2010-12-03)全球主要项目网站的数据,为自由职业者.威客和外包接单个人及团队提供极具参考价值的项目分析报告.项目快报从4个角度来分析项目分类 ...

最新文章

  1. TensorRT优化方案图例
  2. 浙江省高校计算机等级考试三级考什么容易,浙江省高校计算机等级考试大纲(三级)(3)...
  3. Python获取同目录下json文件内容
  4. bdc注意清空bdcdata【否则bdc可能…
  5. hbase入门综合概要介绍
  6. php通过mysqli链接mysql数据库
  7. PowerManager.WakeLock使用(屏幕恒亮)
  8. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
  9. daterangepicker日历插件使用参数注意问题
  10. 欧盟无线产品RED认证
  11. Silverlight4启动无法调试
  12. iso硬盘安装 凤凰os_在Linux中安装凤凰系统(Phoenix OS)的方法
  13. mouseover、mouseenter
  14. 记一次笔记本连接酒店Wifi点击认证后总是报网络连接问题
  15. 5G发展面临窘境,5G手机销量环比下滑,手机企业对5G热情降温
  16. java xml最火的的工具_几种高效的Java工具类推荐
  17. Python Scarpy Crawl Dmoz Settings
  18. 移动宽带GM220-S光猫桥接
  19. R 语言 4.2.2安装 WGCNA
  20. 淘宝、百度、腾讯、新浪开放平台

热门文章

  1. 三种交换方式(电路交换,报文交换,分组交换)
  2. Cesium已知经纬度获取其高度
  3. 「保姆级教学」Mac下JDK环境配置
  4. 2015年4月份国内浏览器市场份额排行榜
  5. java后端面试大全,java后端面试宝典
  6. python-》基于opencv2通过图片视觉处理+android adb tools 实现QQ自动点赞
  7. k8s批量删除Evicted Pods
  8. 爬虫爬取王者荣耀英雄
  9. 基于Spring Boot的在线外卖系统的设计与实现 .rar(毕业论文+程序源码)
  10. 这个平台展示了如何使用AI预测股市走向