Android8.1 Launcher3 去掉抽屉(三)

上篇博客遗留了两个问题:
a.workspace中的app和HotSeat中有重复的
b.HotSeat中可以创建文件夹
其实问题b可以归类为整体布局逻辑,而且文件夹的样式也不是国内的主流形式。所以问题b先放着,后续和修改文件夹的样式一起修改,这篇博客主要解决问题a。

在src/com/android/launcher3/model/LoaderTask.java中的loadWorkspace(),可以看到是从数据库中加载数据的

    private void loadWorkspace() {    ......synchronized (mBgDataModel) {            mBgDataModel.clear();            final HashMap<String, Integer> installingPkgs =                    mPackageInstaller.updateAndGetActiveSessionCache();            mBgDataModel.workspaceScreens.addAll(LauncherModel.loadWorkspaceScreensDb(context));            Map<ShortcutKey, ShortcutInfoCompat> shortcutKeyToPinnedShortcuts = new HashMap<>();            final LoaderCursor c = new LoaderCursor(contentResolver.query(                    LauncherSettings.Favorites.CONTENT_URI, null, null, null, null), mApp);            HashMap<ComponentKey, AppWidgetProviderInfo> widgetProvidersMap = null;            ......            }    ......    }

可以看到这里是查询了数据库,所以我就去数据库查看,在data/data/com.android.launcher3/中可以看到三个数据库:app_icons.db launcher.db widgetpreviews.db,我用的Ubuntu,所以安装了一个sqliteBrower(sudo apt-get install sqliteBrower)。
导入这三个db,发现在launcher.db中有一张表favorites,里面是我们需要的数据,在Launcher上应该显示22个APP,但是在表中有28条数据,其中有6条是重复的。

那么接下里的思路就很清晰了,就是要把这多余的6条数据剔除,为了快速完成,刚开始我是想在查询的时候过滤,试了一下,发现涉及的逻辑太多,我对Launcher的代码又不够熟悉;于是转变思路,在插入的时候过滤,最终还是回到我的Launcher第一篇博客中的
src/com/android/launcher3/model/LoaderTask.java -> verifyApplications():

private void verifyApplications() {        final Context context = mApp.getContext();        ArrayList.PendingInstallShortcutInfo> items = new ArrayList<>();        synchronized (this) {            for (AppInfo app : mBgAllAppsList.data) {                Intent data = app.getIntent();                data.putExtra(Intent.EXTRA_SHORTCUT_INTENT, data);                data.putExtra(Intent.EXTRA_SHORTCUT_ICON, app.iconBitmap);                data.putExtra(Intent.EXTRA_SHORTCUT_NAME, app.title);                InstallShortcutReceiver.PendingInstallShortcutInfo info = new InstallShortcutReceiver.PendingInstallShortcutInfo(                        data, app.user, context);                items.add(info);            }        }        //过滤重复APP begin        final ContentResolver cr = context.getContentResolver();        Cursor cursor = cr.query(LauncherSettings.Favorites.CONTENT_URI,                null, null, null, null);        ArrayList intents = new ArrayList<>();        try {            if (cursor.moveToFirst()) {                do {                    String intent = cursor.getString(cursor.getColumnIndex(LauncherSettings.Favorites.INTENT));                    LogUtil.d(TAG, "intent = " + intent);                    intents.add(intent);                } while (cursor.moveToNext());            }        } finally {            cursor.close();        }        ArrayList.PendingInstallShortcutInfo> itemsRm = new ArrayList<>();        for (InstallShortcutReceiver.PendingInstallShortcutInfo info : items) {            if (info == null || info.getItemInfo() == null || info.getItemInfo().first == null || info.getItemInfo().first.getTargetComponent() == null                    || info.getItemInfo().first.getTargetComponent().getPackageName() == null) {                continue;            }            String packageName = info.getItemInfo().first.getTargetComponent().getPackageName();            for (String intent : intents) {                if (intent != null && intent.contains(packageName)) {                    itemsRm.add(info);                }            }        }        for (InstallShortcutReceiver.PendingInstallShortcutInfo info : itemsRm) {            if (items.contains(info)) {                items.remove(info);            }        }        itemsRm.clear();        itemsRm = null;         //过滤重复APP end        if (!items.isEmpty()) {            mApp.getModel().addAndBindAddedWorkspaceItems(                    new InstallShortcutReceiver.LazyShortcutsProvider(context.getApplicationContext(), items));        }    }

运行一下,很开心,发现搞定了!!!

总结:因为这次的需求,时间要求比较着急,而且我对Launcher也不熟悉,所以很多地方没有考虑太多,基本都是能实现功能就OK,如果以后有时间,代码还需要再重新整理一下。

更多相关文章

  1. Android数据库操作的简单封装
  2. 资源之关于资源文件夹介绍
  3. Android中的跨进程通信方法实例及特点分析(二):ContentProvider
  4. Android中Content Provide
  5. 基于ffmpeg+opengl+opensl es的android视频播放器
  6. android 开发规范
  7. 阿里Android开发手册读后感-上篇
  8. Android(安卓)Jetpack简介
  9. Android读取php发布的webservice乱码问题解决

随机推荐

  1. VMware实现Android x86 8.1 从安装到使用
  2. android 如何动态设置View的margin和padd
  3. Android 通过java代码实现EditText输入限
  4. android中自定义控件的属性
  5. android listView EditText获取焦点
  6. Android:实现videoview缓冲监听
  7. 关于Android(安卓)获得图片的总结
  8. android解析XML文件的三方法之SAX
  9. RelativeLayout部分属性介绍
  10. 毕业设计3(研究android中的action)