Launcher3 数据库初始化分析

一.初始化创建launcher.db数据库,数据库里创建了两张表,分别是favorites和workspaceScrrens。

1.其表结构为:

Launcher3 数据库初始化分析_第1张图片

 

2.内容为,举例:

Launcher3 数据库初始化分析_第2张图片

Launcher3 数据库初始化分析_第3张图片

3.字段含义:

 _id:用于标识区分各个应用图标,是表favorites的主键,当添加数据时通过generateNewId使_id值增加。

    title:在WorkSpace(HotSeat中一般会隐藏掉)中展示的应用快捷图标的标题。

    intent:当点击桌面图标时的负责启动应用的intent,它通过Intent.toUri()转换为String存储,在使用时通过Intent.parseUri()转换为intent。

    container:指的是当前数据所在的容器类型,在Launcher中有两种container类型:1.CONTAINER_DESKTOP(-100), 2.CONTAINER_HOTSEAT(-101)。

    screen:用于标识当前数据所在的页。当container为-100时,则screen的值表现为我们桌面的页数的值,当container为-101即当前快捷图标处于HotSeat时,则指快捷图标所在的第X个位置。

    cellX:当前快捷图标所在页(CellLayout)的X位置,即快捷图标在当前页横向的第X个位置。

    cellY:当前快捷图标所在页(CellLayout)的Y位置,即快捷图标在当前页纵向的第Y个位置。

    spanX:当前快捷图标的在所在页(CellLayout)的横向范围信息,如果当前图标为application、shortcut、folder则为1,表示图标横向上占据一个cell的位置范围。如果当前图标为Widget,则横向占据范围可能为多个cell。

    spanY:当前快捷图标的在所在页(CellLayout)的纵向范围信息,如果当前图标为application、shortcut、folder则为1,表示图标纵向上占据一个cell的位置范围。如果当前图标为Widget,则纵向占据范围可能为多个cell。

二.数据库的创建

1.数据库的创建是在LauncherProvider中,以ContentProvider的形式建立

三.数据库数据的初始化

1.在Launcher初始化数据类LoaderTask中,在loadWorkspace方法中调用了

    if (clearDb) {
            Log.d(TAG, "loadWorkspace: resetting launcher database");
            LauncherSettings.Settings.call(contentResolver,
                    LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB);
        }

        Log.d(TAG, "loadWorkspace: loading default favorites");
        LauncherSettings.Settings.call(contentResolver,
                LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES);

如果数据库clear的情况下,调用LauncherSettings.Setting.call方法重新建立数据库,如果有数据库,就配置默认的favorites表数据,call方法的真正实现在LauncherProvider中:

  @Override
    public Bundle call(String method, final String arg, final Bundle extras) {
        if (Binder.getCallingUid() != Process.myUid()) {
            return null;
        }
        createDbIfNotExists();

        switch (method) {
            case LauncherSettings.Settings.METHOD_SET_EXTRACTED_COLORS_AND_WALLPAPER_ID: {
                String extractedColors = extras.getString(
                        LauncherSettings.Settings.EXTRA_EXTRACTED_COLORS);
                int wallpaperId = extras.getInt(LauncherSettings.Settings.EXTRA_WALLPAPER_ID);
                Utilities.getPrefs(getContext()).edit()
                        .putString(ExtractionUtils.EXTRACTED_COLORS_PREFERENCE_KEY, extractedColors)
                        .putInt(ExtractionUtils.WALLPAPER_ID_PREFERENCE_KEY, wallpaperId)
                        .apply();
                mListenerHandler.sendEmptyMessage(ChangeListenerWrapper.MSG_EXTRACTED_COLORS_CHANGED);
                Bundle result = new Bundle();
                result.putString(LauncherSettings.Settings.EXTRA_VALUE, extractedColors);
                return result;
            }
            case LauncherSettings.Settings.METHOD_CLEAR_EMPTY_DB_FLAG: {
                clearFlagEmptyDbCreated();
                return null;
            }
            case LauncherSettings.Settings.METHOD_WAS_EMPTY_DB_CREATED : {
                Bundle result = new Bundle();
                result.putBoolean(LauncherSettings.Settings.EXTRA_VALUE,
                        Utilities.getPrefs(getContext()).getBoolean(EMPTY_DATABASE_CREATED, false));
                return result;
            }
            case LauncherSettings.Settings.METHOD_DELETE_EMPTY_FOLDERS: {
                Bundle result = new Bundle();
                result.putSerializable(LauncherSettings.Settings.EXTRA_VALUE, deleteEmptyFolders());
                return result;
            }
            case LauncherSettings.Settings.METHOD_NEW_ITEM_ID: {
                Bundle result = new Bundle();
                result.putLong(LauncherSettings.Settings.EXTRA_VALUE, mOpenHelper.generateNewItemId());
                return result;
            }
            case LauncherSettings.Settings.METHOD_NEW_SCREEN_ID: {
                Bundle result = new Bundle();
                result.putLong(LauncherSettings.Settings.EXTRA_VALUE, mOpenHelper.generateNewScreenId());
                return result;
            }
            case LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB: {
                mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase());
                return null;
            }
            case LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES: {
                loadDefaultFavoritesIfNecessary();
                return null;
            }
            case LauncherSettings.Settings.METHOD_REMOVE_GHOST_WIDGETS: {
                mOpenHelper.removeGhostWidgets(mOpenHelper.getWritableDatabase());
                return null;
            }
        }
        return null;
    }

 

调用loadDefaultFavoritesIfNecessary方法

synchronized private void loadDefaultFavoritesIfNecessary() {
        SharedPreferences sp = Utilities.getPrefs(getContext());

        if (sp.getBoolean(EMPTY_DATABASE_CREATED, false)) {
            Log.d(TAG, "loading default workspace");

            AppWidgetHost widgetHost = mOpenHelper.newLauncherWidgetHost();
            AutoInstallsLayout loader = createWorkspaceLoaderFromAppRestriction(widgetHost);
            if (loader == null) {
                loader = AutoInstallsLayout.get(getContext(),widgetHost, mOpenHelper);
            }
            if (loader == null) {
                final Partner partner = Partner.get(getContext().getPackageManager());
                if (partner != null && partner.hasDefaultLayout()) {
                    final Resources partnerRes = partner.getResources();
                    int workspaceResId = partnerRes.getIdentifier(Partner.RES_DEFAULT_LAYOUT,
                            "xml", partner.getPackageName());
                    if (workspaceResId != 0) {
                        loader = new DefaultLayoutParser(getContext(), widgetHost,
                                mOpenHelper, partnerRes, workspaceResId);
                    }
                }
            }

            final boolean usingExternallyProvidedLayout = loader != null;
            if (loader == null) {
                loader = getDefaultLayoutParser(widgetHost);
            }

            // There might be some partially restored DB items, due to buggy restore logic in
            // previous versions of launcher.
            mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase());
            // Populate favorites table with initial favorites
            if ((mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(), loader) <= 0)
                    && usingExternallyProvidedLayout) {
                // Unable to load external layout. Cleanup and load the internal layout.
                mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase());
                mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(),
                        getDefaultLayoutParser(widgetHost));
            }
            clearFlagEmptyDbCreated();
        }
    }

可以在该方法中,定制favorites表的初始化数据,这样就可以在Launcher启动时候,屏幕显示定制的app,默认加载xml件是default_workspce_n*n的文件,如



    
    
    
        
        
        
    

    
        
        
        
        
        
    

    

    
        
        
    

    
        
        
    


 

 

 

你可能感兴趣的:(Launcher,Launcher3)