我正在开发一个应用程序,它应该在安装后将其快捷方式添加到主屏幕,并在卸载应用程序后将其删除。应用程序将预先安装在最终用户设备上,但仍应具有卸载选项。这项任务看起来非常简单,但我遇到了很多麻烦。
我做了什么:
我不能(并且几乎放弃):
无法使用Intent.ACTION_PACKAGE_REMOVED,因为正在卸载的应用程序未收到此意图。 我进行了一些测试,发现使用该应用程序删除的唯一快捷方式是从菜单'添加到主屏幕=>创建的快捷方式;快捷方式=>应用程序=>申请活动'。在卸载应用程序后,以编程方式创建或在AndroidManifest中声明的快捷方式仍保留在主屏幕上。
在论坛上几乎没有关于这个主题的文档和帖子,我有点困惑为什么这样一个与Android安全策略不矛盾的简单操作无法直接实现。
有没有办法要求操作系统删除应用程序卸载时的相应快捷方式? 我可以在删除应用程序之前捕获应用程序正在卸载的事件吗?
答案 0 :(得分:2)
我不相信你能做到这一点。
首先,因为您无法卸载预先安装在设备固件上的应用程序 - 它们存在于/system
分区,这是一个只读文件系统。
其次,正如您所说,您的申请receives no notification that it is being uninstalled。
如果用户可能不想使用您的应用程序,他们是否会忽略应用程序图标,就像我在手机上安装几个预先安装的应用程序一样?
修改强>
如果您要预安装应用程序(但不是作为commonsware.com注释的固件),您可以预安装两个 APK。其中一个没有启动器,只包含处理ACTION_PACKAGE_REMOVED
事件并调用UNINSTALL_SHORTCUT
的广播接收器。
我不相信有任何明确的权限检查需要通过添加它的同一个应用删除快捷方式,但是无论如何都可以通过对两个APK使用sharedUserId
来解决这个问题。
答案 1 :(得分:2)
似乎您没有以正确的方式使用install_shortcut意图。可能你没有任何参数就创建了一个intent。您应该使用 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 :(得分:1)
您所描述的是主屏幕的限制。下一版本的Launcher2解决了这个问题,并自动删除与应用程序关联的小部件和快捷方式。如果找不到任何关联(例如,如果您的应用创建了音乐播放器的快捷方式,则可能会留下一些快捷方式。)