2010-01-25 81 views
6

我正在开发一个应用程序,它应该在安装后将其快捷方式添加到主屏幕,并在应用程序卸载后将其删除。应用程序将预安装在最终用户设备上,但仍应具有卸载选项)。该任务看起来很简单,但我遇到了很多实施它的麻烦。如何从主屏幕上自动卸载应用程序快捷方式?

我做了什么:

  • 快捷键添加到应用上的第一次发射或螈设备 重启使用 com.android.launcher.action.INSTALL_SHORTCUT 主屏幕。
  • 手动删除使用 com.android.launcher.action.UNINSTALL_SHORTCUT的快捷方式。

我不能(而且几乎放弃):

  • 自动删除快捷方式时 的应用程序被卸载。

没有办法使用Intent.ACTION_PACKAGE_REMOVED,因为卸载的应用程序没有收到这个意图。 我进行了一些测试,发现使用该应用程序删除的唯一快捷方式是从菜单'添加到主屏幕=>快捷方式=>应用程序=>应用程序活动'创建的快捷方式。正在以编程方式创建的快捷方式或在AndroidManifest中声明的快捷方式在卸载应用程序后仍保留在主屏幕上。

几乎没有关于此主题的论坛上的文档和帖子,我有点困惑,为什么这样一个不会与Android安全策略相抵触的简单操作无法以直接方式实现。

有什么办法可以要求操作系统删除应用程序卸载相应的快捷方式? 我可以捕获应用程序在被移除之前被卸载的事件吗?

回答

2

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

首先,因为无法卸载预装在设备固件—上的应用程序,它们存在于/system分区,该分区是一个只读文件系统。其次,正如你注意到的,你的应用receives no notification that it is being uninstalled

如果用户可能不想使用您的应用程序,他们是不是会忽略应用程序图标,就像我为我手机上的几个预安装的应用程序一样?


编辑:
如果您要预先安装的应用程序(但不是在固件commonsware.com注),你可以预先安装的APK。其中一个没有发射器,仅由一个处理ACTION_PACKAGE_REMOVED事件的广播接收器组成,并且呼叫UNINSTALL_SHORTCUT

我不认为有任何明确的权限检查需要使用添加该应用的相同应用删除快捷方式,但无论如何都可以通过对这两个APK使用sharedUserId来解决。

+0

请注意,“预安装”不一定意味着“固件”。可以安装应用程序,就好像它是普通应用程序一样,但可能会事先在设备上提供。例如,ARCHOS 5 Android平板电脑可以用十几个应用程序来完成这项工作。 – CommonsWare 2010-01-25 12:13:20

+0

确实。我正在处理那些*将安装在固件上的应用程序,所以我一定要提到固件部分。但我认为由于缺乏PACKAGE_REMOVED广播,问题依然存在。 – 2010-01-25 12:33:32

+0

尽管您的评论促使我为非固件预安装添加了一个潜在解决方案。 :) – 2010-01-25 12:40:07

1

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

+0

听起来不错。哪个版本将包含新的启动器? – 2010-01-26 19:42:15

2

看起来您并未正确使用install_shortcut意图。可能你创建一个没有任何参数的意图。您应该创建一个动作Intent.ACTION_MAIN param。

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); 
相关问题