公司某产品性能有限,需要屏蔽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" />
分享到:
相关推荐
在 Launcher3 中,搜索框是用户查找应用程序的入口点。为了去掉搜索框,我们需要在 QsbContainerView.java 文件中进行修改。具体来说,我们需要在 onClick 事件中注释掉 startActivity 代码,以阻止搜索框的弹出。 ...
Android原生Launcher3是Android操作系统中的主屏幕应用程序,它为用户提供了一个界面来启动应用、管理桌面快捷方式和小部件。在Android 5.1版本中,Launcher3作为默认的启动器,具有简洁、高效的特性。下面我们将...
在Android开发中,Launcher是用户接触系统的第一个界面,它通常包含主屏幕(也称为工作区WorkSpace)和其他应用快捷方式。工作区的左右滑动效果是Android Launcher的一个核心功能,让用户能够轻松地在不同的主屏幕...
Android操作系统的核心组件之一就是Launcher,它是用户与系统交互的入口,负责展示桌面图标、应用抽屉等。在深入理解Android系统工作原理时,学习Launcher的源码是非常重要的一环。这里我们主要探讨的是Android 2.2...
在Android开发中,`Launcher`是一个至关重要的组件,它是用户与设备交互的入口,负责显示应用图标、桌面小部件以及管理手机的主屏幕。在Android 4.4(KitKat)版本中,`Launcher`的实现更加复杂和优化,以提供更好的...
这三个category的组合使得该Activity不仅能作为应用的入口,还能替代系统默认的Launcher应用。 知识点五:修改AndroidManifest.xml的必要性 通过向intent-filter中添加category,可以改变Activity的行为。在本例中...
在Android系统中,Launcher是用户与设备交互的入口,用于展示和启动各种应用程序。下面将详细探讨这种特定类型的Launcher及其核心组件和技术。 "tab"在UI设计中指的是标签页,常用于组织和切换不同内容区域。在"机...
- 主Activity:通常为`LauncherActivity`,它是用户与Launcher交互的主要入口点,处理触摸事件、启动应用等。 - 数据加载:理解如何从Provider或数据库加载应用信息和快捷方式。 - 动画与布局:研究如何实现滑动...
Arctium WoW Client Launcher 27377版本。 HOWTO: 安装方法: 1.Use 7zip/WinRAR to extract the archive into your wow folder. 1.用解压软件将压缩包内容解压到WOW文件夹内,即将Arctium WoW Client Launcher....
Android Launcher 是 Android 系统中一个非常重要的组件,负责显示桌面程序和管理应用程序图标。了解 Launcher 的源码可以帮助我们更好地理解 Android 系统的设计思想和实现机制。本文将对 Launcher 的源码进行深入...
11. **Launcher**: Launcher的主入口文件,类似于操作系统中的idle进程。 12. **LauncherModel**: 负责将Launcher的所有运行时变量保存到内存中,并提供数据库接口方便参数操作。 13. **LauncherProvider**: 继承自...
在Android系统中,主启动器(Launcher)是用户与设备交互的核心组件,它负责展示应用图标、快捷方式以及壁纸等,使用户能够启动各种应用程序。然而,Android平台的开放性允许开发者创建次级启动器(Secondary ...
在Android操作系统中,Launcher2是默认的主屏幕应用,它为用户提供了一个界面来启动其他应用程序、管理桌面快捷方式和小部件。本篇文章将深入探讨如何实现Android系统的Launcher2,以及其核心功能和工作原理。 首先...
Android 11中的Launcher3是系统启动器的主要组件,它是用户与设备交互的门户,负责显示应用图标、桌面壁纸、小部件等。Launcher3不仅承担着应用启动的任务,还管理着用户的主屏幕布局、搜索功能以及各种个性化设置。...
### 让你定制的Launcher成为系统中唯一的Launcher 在Android系统中,Launcher(启动器)是用户与系统交互的重要界面之一。它不仅负责显示应用程序图标、桌面小部件等元素,还承担着启动应用的重要职责。为了让...
### 修改Launcher让图标不显示在桌面或主菜单中的方法 #### 概述 在Android 2.3系统中,可以通过自定义Launcher应用来控制应用程序图标是否显示在桌面或主菜单中。这一操作对于定制化系统界面、提升用户体验等方面...
- `LauncherActivity`:作为 Launcher3 的主入口,它是整个启动器的核心组件。它继承自 `Activity`,并实现了触摸事件处理、屏幕布局更新等功能。 - `Workspace`:负责管理主屏幕的工作区,包含多个页面(屏幕),...
android源代码 http://blog.csdn.net/aomandeshangxiao/article/details/6940670#reply讲解所用部分
1. **Launcher**:这是整个应用的主入口,负责初始化和管理其他组件。其中,`onCreate()`方法是启动时执行的关键,它会初始化workspace、app drawer和其他UI元素。 2. **Workspace**:这个类代表了主屏幕,包含了多...
- **Activity**:Launcher至少包含一个Activity作为主入口。常见的有MainActivity,用于显示Launcher界面。 - **Service**:用于后台运行的任务,例如定时更新桌面小部件(widgets)。 - **BroadcastReceiver**:...