概述
前言
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
@Override
public void run() {
// TODO Auto-generated method stub
hotseatScreenOnAnimator();
mDragLayer.unLockAnim();
mWorkspace.setVisibility(View.VISIBLE);
}
}, 5000);
LauncherActivity.onDestroy
LauncherProvider.getIntance(this).destory();
mResendHelper.destroy();
在 onDestroy()方法中关闭相关的资源。
LauncherProvideer 使用了单例模式,使用双检锁的形式实现,双重锁:两次判断,一次加锁。 这种方式采用双锁机制,保证在多线程的环境下不出错。而mResendHelper.destroy() 调用 mContext.unregisterReceiver(mNetChangeReceiver),取消消息订阅实现观察者的注销。
最后
以上就是热心汉堡为你收集整理的LauncherActivity 项目分析的全部内容,希望文章能够帮你解决LauncherActivity 项目分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复