`
unicorn25
  • 浏览: 67067 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

如何隐藏Launcher中live wallpapers入口

阅读更多

公司某产品性能有限,需要屏蔽live wallpapers防止内存使用量过大影响客户体验,于是按照经验在Launcher2目录寻找设置壁纸对话框对应的代码,前一个"Add to Home screen"Dialog对象创建位置轻松找到,在Launcher.java中有如下代码:

 

        if (mWorkspace.allowLongPress()) {
            if (cellInfo.cell == null) {
                if (cellInfo.valid) {
                    // User long pressed on empty space
                    mWorkspace.setAllowLongPress(false);
                    mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS,
                            HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
                    showAddDialog(cellInfo);
                }
            } else {
                if (!(cellInfo.cell instanceof Folder)) {
                    // User long pressed on an item
                    mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS,
                            HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
                    mWorkspace.startDrag(cellInfo);
                }
            }
        }

 

继续寻找showAddDialog(cellInfo):

 

 

    private void showAddDialog(CellLayout.CellInfo cellInfo) {
        mAddItemCellInfo = cellInfo;
        mWaitingForResult = true;
        showDialog(DIALOG_CREATE_SHORTCUT);
    }

 

代码携带参数跳入Launcher.java的父类Activity.java的showDialog()方法,在Activity.java源码中查找,发现接下来将会跳入Launcher.java的onCreateDialog(int id)方法,代码如下:

 

 

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case DIALOG_CREATE_SHORTCUT:
                return new CreateShortcut().createDialog();
            case DIALOG_RENAME_FOLDER:
                return new RenameFolder().createDialog();
        }

        return super.onCreateDialog(id);
    }

 

显然,这里return 的是case  DIALOG_CREATE_SHORTCUT,再进入私有类CreateShortcut

 

 

        Dialog createDialog() {
            mWaitingForResult = true;

            mAdapter = new AddAdapter(Launcher.this);

            final AlertDialog.Builder builder = new AlertDialog.Builder(Launcher.this);
            builder.setTitle(getString(R.string.menu_item_add_item));
            builder.setAdapter(mAdapter, this);

            builder.setInverseBackgroundForced(true);

            AlertDialog dialog = builder.create();
            dialog.setOnCancelListener(this);
            dialog.setOnDismissListener(this);
            dialog.setOnShowListener(this);

            return dialog;
        }

 

至此,看到了第一个"Add to Home screen"Dialog的初始化位置,进入AddAdapter的构造器,里面有如下代码:

 

 

        mItems.add(new ListItem(res, R.string.group_shortcuts,
                R.drawable.ic_launcher_shortcut, ITEM_SHORTCUT));

        mItems.add(new ListItem(res, R.string.group_widgets,
                R.drawable.ic_launcher_appwidget, ITEM_APPWIDGET));
        
        mItems.add(new ListItem(res, R.string.group_live_folders,
                R.drawable.ic_launcher_folder, ITEM_LIVE_FOLDER));
        
        mItems.add(new ListItem(res, R.string.group_wallpapers,
                R.drawable.ic_launcher_wallpaper, ITEM_WALLPAPER));

 

如果要对"Add to Home screen"对话框下手,此处正当其位.

然而,我的目标却不是它,继续往下走,郁闷的事情发生了,在"Add to Home screen"Dialog的ItemClick事件处理中,只有如下代码:

 

 

                case AddAdapter.ITEM_WALLPAPER: {
                    startWallpaper();
                    break;

 

再看startWallpaper()方法

 

 

    private void startWallpaper() {
        closeAllApps(true);
        final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
        Intent chooser = Intent.createChooser(pickWallpaper,
                getText(R.string.chooser_wallpaper));
        // NOTE: Adds a configure option to the chooser if the wallpaper supports it
        //       Removed in Eclair MR1
//        WallpaperManager wm = (WallpaperManager)
//                getSystemService(Context.WALLPAPER_SERVICE);
//        WallpaperInfo wi = wm.getWallpaperInfo();
//        if (wi != null && wi.getSettingsActivity() != null) {
//            LabeledIntent li = new LabeledIntent(getPackageName(),
//                    R.string.configure_wallpaper, 0);
//            li.setClassName(wi.getPackageName(), wi.getSettingsActivity());
//            chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { li });
//        }
        startActivityForResult(chooser, REQUEST_PICK_WALLPAPER);
    }

 

由于对Intent的粗浅了解,很自然的,我直奔Launcher中注册有ACTION_SET_WALLPAPER的Activity--WallpaperChooser.java,悲剧的是,迎接我的,却是选择壁纸的初始化界面...

另一个dialog的初始化代码神秘的消失了...

 

我跳到Launcher的资源文件目录,想从strings.xml和drawable中找到第二个对话框引用的资源文件,然后所有资源名,找到加载资源的代码,但是,一个都没找到.....反倒在package目录的Wallpaper中找到.

百思不得其解折腾了一小时后,郁闷的上洗手间的时候我终于想到了它的原理:

原来,这第二个dialog并不属于Launcher应用,而是系统接收到这个叫chooser的intent后,查找所有能匹配的Activity得到结果,第二个dialog中的图片文字,在launcher的资源文件中也是没有的,这也是我在Launcher的strings.xml找不到线索的原因.幽默的是,我上洗手间之前,决定删除live Wallpaper对应的apk源码做尝试,而实际上,这就是切合原理的解决之道,而不会引起异常,当然,还有另一种方法,修改live wallpaper应用的intent注册内容也可以做到.

下午复查了下所有wallpaper app,果然都有

<action android:name="android.intent.action.SET_WALLPAPER" />

分享到:
评论

相关推荐

    7.1 Launcher3 去掉应用抽屉

    在 Launcher3 中,搜索框是用户查找应用程序的入口点。为了去掉搜索框,我们需要在 QsbContainerView.java 文件中进行修改。具体来说,我们需要在 onClick 事件中注释掉 startActivity 代码,以阻止搜索框的弹出。 ...

    Launcher3_android原生launcher_

    Android原生Launcher3是Android操作系统中的主屏幕应用程序,它为用户提供了一个界面来启动应用、管理桌面快捷方式和小部件。在Android 5.1版本中,Launcher3作为默认的启动器,具有简洁、高效的特性。下面我们将...

    拆解Launcher中的WorkSpace实现左右滑动效果

    在Android开发中,Launcher是用户接触系统的第一个界面,它通常包含主屏幕(也称为工作区WorkSpace)和其他应用快捷方式。工作区的左右滑动效果是Android Launcher的一个核心功能,让用户能够轻松地在不同的主屏幕...

    android Launcher2.2源码

    Android操作系统的核心组件之一就是Launcher,它是用户与系统交互的入口,负责展示桌面图标、应用抽屉等。在深入理解Android系统工作原理时,学习Launcher的源码是非常重要的一环。这里我们主要探讨的是Android 2.2...

    Launcher依赖的jar包

    在Android开发中,`Launcher`是一个至关重要的组件,它是用户与设备交互的入口,负责显示应用图标、桌面小部件以及管理手机的主屏幕。在Android 4.4(KitKat)版本中,`Launcher`的实现更加复杂和优化,以提供更好的...

    android手把手教你开发launcher(AndroidStudio版)

    这三个category的组合使得该Activity不仅能作为应用的入口,还能替代系统默认的Launcher应用。 知识点五:修改AndroidManifest.xml的必要性 通过向intent-filter中添加category,可以改变Activity的行为。在本例中...

    Launcher.rar基于AS

    - 主Activity:通常为`LauncherActivity`,它是用户与Launcher交互的主要入口点,处理触摸事件、启动应用等。 - 数据加载:理解如何从Provider或数据库加载应用信息和快捷方式。 - 动画与布局:研究如何实现滑动...

    机顶盒launcher

    在Android系统中,Launcher是用户与设备交互的入口,用于展示和启动各种应用程序。下面将详细探讨这种特定类型的Launcher及其核心组件和技术。 "tab"在UI设计中指的是标签页,常用于组织和切换不同内容区域。在"机...

    Arctium WoW Client Launcher

    Arctium WoW Client Launcher 27377版本。 HOWTO:​ 安装方法: 1.Use 7zip/WinRAR to extract the archive into your wow folder. 1.用解压软件将压缩包内容解压到WOW文件夹内,即将Arctium WoW Client Launcher....

    让你定制的Launcher成为系统中唯一的Launcher.txt

    ### 让你定制的Launcher成为系统中唯一的Launcher 在Android系统中,Launcher(启动器)是用户与系统交互的重要界面之一。它不仅负责显示应用程序图标、桌面小部件等元素,还承担着启动应用的重要职责。为了让...

    android Launcher源码详解

    Android Launcher 是 Android 系统中一个非常重要的组件,负责显示桌面程序和管理应用程序图标。了解 Launcher 的源码可以帮助我们更好地理解 Android 系统的设计思想和实现机制。本文将对 Launcher 的源码进行深入...

    Android launcher应用讲解

    11. **Launcher**: Launcher的主入口文件,类似于操作系统中的idle进程。 12. **LauncherModel**: 负责将Launcher的所有运行时变量保存到内存中,并提供数据库接口方便参数操作。 13. **LauncherProvider**: 继承自...

    Android SecondayLauncher 桌面模式launcher sample

    在Android系统中,主启动器(Launcher)是用户与设备交互的核心组件,它负责展示应用图标、快捷方式以及壁纸等,使用户能够启动各种应用程序。然而,Android平台的开放性允许开发者创建次级启动器(Secondary ...

    android系统 launcher2

    在Android操作系统中,Launcher2是默认的主屏幕应用,它为用户提供了一个界面来启动其他应用程序、管理桌面快捷方式和小部件。本篇文章将深入探讨如何实现Android系统的Launcher2,以及其核心功能和工作原理。 首先...

    Android11 Launcher3

    Android 11中的Launcher3是系统启动器的主要组件,它是用户与设备交互的门户,负责显示应用图标、桌面壁纸、小部件等。Launcher3不仅承担着应用启动的任务,还管理着用户的主屏幕布局、搜索功能以及各种个性化设置。...

    修改Launcher让图标不显示在桌面或者主菜单中

    ### 修改Launcher让图标不显示在桌面或主菜单中的方法 #### 概述 在Android 2.3系统中,可以通过自定义Launcher应用来控制应用程序图标是否显示在桌面或主菜单中。这一操作对于定制化系统界面、提升用户体验等方面...

    Android5.0 Launcher3源码

    - `LauncherActivity`:作为 Launcher3 的主入口,它是整个启动器的核心组件。它继承自 `Activity`,并实现了触摸事件处理、屏幕布局更新等功能。 - `Workspace`:负责管理主屏幕的工作区,包含多个页面(屏幕),...

    launcher中workspace代码

    android源代码 http://blog.csdn.net/aomandeshangxiao/article/details/6940670#reply讲解所用部分

    Android Launcher3源码

    其中,`Launcher3`是Android开源项目AOSP(Android Open Source Project)中的默认启动器实现。通过分析`Launcher3`的源码,我们可以深入理解Android系统桌面的工作原理,了解如何定制自己的启动器。 1. **项目结构...

    android launcher3源码 循环翻页

    1. **Launcher**:这是整个应用的主入口,负责初始化和管理其他组件。其中,`onCreate()`方法是启动时执行的关键,它会初始化workspace、app drawer和其他UI元素。 2. **Workspace**:这个类代表了主屏幕,包含了多...

Global site tag (gtag.js) - Google Analytics