我是靠谱客的博主 热心汉堡,最近开发中收集的这篇文章主要介绍LauncherActivity 项目分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

image.png

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 项目分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部