由于工作需要,也是因为想认真了解Launcher3的运行原理,所有潜下心来研究一下。

首先当然是按部就班。AndroidManifest.xml-->LauncherApplication.java-->LauncherAppState.java


LauncherApplication.java没有什么好分析的,这篇文章就主要分析一下LauncherAppState.java ,当然从构造函数开始来分析,源码如下。

    private LauncherAppState() {        if (sContext == null) {            throw new IllegalStateException("LauncherAppState inited before app context set");        }        Log.v(Launcher.TAG, "LauncherAppState inited");        if (sContext.getResources().getBoolean(R.bool.debug_memory_enabled)) {            MemoryTracker.startTrackingMe(sContext, "L");        }        /*上面没有什么好分析的,主要是方便调试用的*/
               // set sIsScreenXLarge and mScreenDensity *before* creating icon cache        mIsScreenLarge = isScreenLarge(sContext.getResources());        mScreenDensity = sContext.getResources().getDisplayMetrics().density;        //判断是否为大屏平板和获取屏幕的密度,获取大屏在本文件有介绍,这里指的注意的是launcher3有一个config.xml的文件,这点做得很好,直接在里面修改bool值就可以
        //屏幕密度在framework处理        
        mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext);        mIconCache = new IconCache(sContext);
        //CacheDb和存储有关,是从SQLiteOpenHelper继承来的;
        //IconCache是icon图标的处理方式,了解一下就可以,没有必要太多的介绍        mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class));        mModel = new LauncherModel(this, mIconCache, mAppFilter);
        //LauncherModel一个重要的类,负责消息处理机制,后面另起文章单独分析        // Register intent receivers        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);        filter.addDataScheme("package");        sContext.registerReceiver(mModel, filter);        filter = new IntentFilter();        filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);        filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);        filter.addAction(Intent.ACTION_LOCALE_CHANGED);        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);        sContext.registerReceiver(mModel, filter);        filter = new IntentFilter();        filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);        sContext.registerReceiver(mModel, filter);        filter = new IntentFilter();        filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);        sContext.registerReceiver(mModel, filter);        if (LauncherLog.DEBUG) {            LauncherLog.d(TAG, "LauncherAppState: mIconCache = " + mIconCache + ", mModel = "                    + mModel + ", this = " + this);        }        // Register for changes to the favorites        ContentResolver resolver = sContext.getContentResolver();        resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,                mFavoritesObserver);    }


更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android(安卓)中屏幕点击事件的实现
  6. android sdk 更新
  7. Android.mk加入aidl编译
  8. Android(安卓)OkHttp基本用法
  9. NSF方式挂载Android分区

随机推荐

  1. android api (83) —— InputMethodSessi
  2. Android学习笔记——各种常用布局管理器
  3. Android(安卓)蓝牙开发(四)OPP传输文件
  4. 基于MQTT实现Android消息推送(Push)(2)
  5. android 有关怎么自己添加系统级服务 jav
  6. Android 网络(四) Retrofit学习笔记
  7. Android UI Operation in Thread
  8. Android快速开发框架介绍
  9. 百度Android开发面试题
  10. Android 五子棋开发经验