如何在应用程序被卸载时自动从主屏幕中删除应用程序快捷方式?

6
我正在开发一个应用程序,安装后应该将其快捷方式添加到主屏幕,并在卸载应用程序后将其删除。该应用程序将预装在最终用户设备上,但仍应具有卸载选项。这个任务看起来非常简单,但我在实现它时遇到了很多麻烦。
我所做的事情: - 在应用程序首次启动或新设备重启时使用com.android.launcher.action.INSTALL_SHORTCUT将快捷方式添加到主屏幕。 - 使用com.android.launcher.action.UNINSTALL_SHORTCUT手动删除快捷方式。
我无法实现的事情: - 当应用程序被卸载时自动删除快捷方式。 没有办法使用Intent.ACTION_PACKAGE_REMOVED,因为正在卸载的应用程序不会收到此意图。我进行了一些测试,并发现唯一会随应用程序一起删除的快捷方式类型是从菜单“添加到主屏幕=> 快捷方式=> 应用程序=> 应用程序活动”创建的快捷方式。以编程方式创建或在AndroidManifest中声明的快捷方式在应用程序卸载后仍保留在主屏幕上。
关于此主题几乎没有文档和论坛帖子,我有点困惑,为什么这样一个不违反Android安全策略的简单操作不能以直接的方式实现。
有没有办法要求操作系统在应用程序卸载时删除相应的快捷方式? 我能否在卸载应用程序之前捕获应用程序正在被卸载的事件?
3个回答

2
看起来你没有正确使用install_shortcut意图。可能你创建了一个没有任何参数的意图。你应该使用一个带有动作Intent.ACTION_MAIN参数的意图创建。
Intent shortcutIntent = new Intent(Intent.ACTION_MAIN);
shortcutIntent.setClassName(this, this.getClass().getName());

Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
            this,  R.drawable.launcher_icon);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
sendBroadcast(intent);

2

我不相信你能做到这一点。

首先,因为您无法卸载设备固件上预安装的应用程序 —— 它们存在于只读文件系统 /system 分区中。

其次,正如您所指出的,您的应用程序没有收到任何关于被卸载的通知

如果用户不想使用您的应用程序,他们不是会像我对手机上的一些预安装应用程序一样忽略应用程序图标吗?


编辑:
如果您要预安装应用程序(但不在固件上安装,如 commonsware.com 所述),则可以预安装两个 APK。其中一个没有启动器,仅由广播接收器组成,处理 ACTION_PACKAGE_REMOVED 事件并调用 UNINSTALL_SHORTCUT

我不相信有任何明确的权限检查要求同一个应用程序删除它添加的快捷方式,但无论如何,您都可以通过为两个 APK 使用sharedUserId来绕过此问题。


请注意,“预装”并不一定意味着“固件”。有可能将应用程序安装为普通应用程序,但恰好提前在设备上发货。例如,ARCHOS 5 Android平板电脑就是这样做的,预先安装了十几个应用程序。 - CommonsWare
确实。我正在处理将在固件上安装应用程序的设备,因此我确保提到了固件部分。但是,由于缺少PACKAGE_REMOVED广播,我认为问题仍然存在。 - Christopher Orr
尽管您的评论促使我为非固件预安装添加了一个潜在的解决方案。 :) - Christopher Orr
Christopher,感谢你提供的两个应用的想法,我会检查一下它是否适合我的应用。 - Vladimir Dmi

1
您所描述的是主屏幕的限制。Launcher2 的下一个版本将解决此问题,并自动删除与应用程序相关联的小部件和快捷方式。但如果找不到关联(例如,如果您的应用程序创建了一个到音乐播放器的快捷方式),则可能会留下一些快捷方式。

听起来不错。哪个版本会包含新的启动器? - Vladimir Dmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接