LauncherActivity 项目分析
前言
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 项目分析相关推荐
- python launcher怎么使用_QMUI实战(一)—为何我们要使用 LauncherActivity?
QMUI 2 发布了,但是里面换肤等相关的很多东西,如果不讲,那么很多人估计就只能复制粘贴下 QMUIDemo 的代码,而并不能用好 QMUI, 或者是通过 QMUI 来提升自己的 UI 开发能力,毕 ...
- 项目分析_xxoo-master
项目介绍:使用java1.5的原生xml操作类实现 对象<-->xml字符串的相互转化 项目分析:主要分为是三个部分 1.容器类:AbstractContainer 存储xml.obj ...
- android 可行性分析,可行性研究项目分析程序与步骤
项目分析程序 项目分析 分析工作步骤 分析程序框架 分段实施方法 第一阶段初期工作 1.收集资料.包括业主的要求,业主已经完成的研究成果,市场.厂址.原料.能源.运输.维修.共用设 施.环境.劳动力来 ...
- 数据仓库项目分析_数据分析项目:仓库库存
数据仓库项目分析 The code for this project can be found at my GitHub. 该项目的代码可以在我的GitHub上找到 . 介绍 (Introductio ...
- winform项目_winform项目——仿QQ即时通讯程序01:原理及项目分析
即时通讯程序,腾讯QQ可以说是一家独大,虽然市场上仍然有类似QQ的即时通讯程序,但是基本上面向的对象都是特定人群.那么,现在做一个即时通讯的软件还有意义吗?在我看来,意义非常大.作为一个学习编程的人, ...
- github开源项目_GitHub项目分析,3D打印义肢和更多开源新闻
github开源项目 在本周的开源新闻摘要中,我们将介绍GitHub项目分析,3D打印修复技术,微生物组预测算法等等! 2016年6月26日至7月2日的开源新闻摘要 GitHub通过Google Bi ...
- 基于MVC的jpetstore项目分析
下面是基于MVC的jpetstore项目分析:jpetstore: github地址:https://github.com/SwordHarry/Jpetstore 使用环境:IntelliJ IDE ...
- BBS(仿博客园系统)项目01(项目分析、表结构设计、注册功能实现)
摘要: 需求分析 表结构设计 注册功能实现 一.需求分析: 项目需求(产品经理.架构师.开发组组长与客户谈该项目相关要求) 项目设计 (架构师需要思考:框架选择,数据库选择,主要功能模块,报价:包括工 ...
- 自由职业者和外包接单项目分析
自由职业者.威客和外包接单项目快报.万事网根据昨天(2010-12-03)全球主要项目网站的数据,为自由职业者.威客和外包接单个人及团队提供极具参考价值的项目分析报告.项目快报从4个角度来分析项目分类 ...
最新文章
- TensorRT优化方案图例
- 浙江省高校计算机等级考试三级考什么容易,浙江省高校计算机等级考试大纲(三级)(3)...
- Python获取同目录下json文件内容
- bdc注意清空bdcdata【否则bdc可能…
- hbase入门综合概要介绍
- php通过mysqli链接mysql数据库
- PowerManager.WakeLock使用(屏幕恒亮)
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
- daterangepicker日历插件使用参数注意问题
- 欧盟无线产品RED认证
- Silverlight4启动无法调试
- iso硬盘安装 凤凰os_在Linux中安装凤凰系统(Phoenix OS)的方法
- mouseover、mouseenter
- 记一次笔记本连接酒店Wifi点击认证后总是报网络连接问题
- 5G发展面临窘境,5G手机销量环比下滑,手机企业对5G热情降温
- java xml最火的的工具_几种高效的Java工具类推荐
- Python Scarpy Crawl Dmoz Settings
- 移动宽带GM220-S光猫桥接
- R 语言 4.2.2安装 WGCNA
- 淘宝、百度、腾讯、新浪开放平台