【问题标题】:How to remove application shortcut from home screen on uninstall automatically?如何在自动卸载时从主屏幕删除应用程序快捷方式?
【发布时间】:2010-01-25 10:46:18
【问题描述】:

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

我做了什么:

  • 使用添加快捷方式到主屏幕 com.android.launcher.action.INSTALL_SHORTCUT 在应用首次启动或在 newt 设备上 重启。
  • 使用手动删除快捷方式 com.android.launcher.action.UNINSTALL_SHORTCUT。

我不能(几乎放弃):

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

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

论坛上几乎没有关于这个主题的文档和帖子,我有点困惑,为什么不能直接实施这样一个不违反 Android 安全策略的简单操作。

有没有办法让操作系统在应用程序卸载时删除相应的快捷方式? 我可以在应用程序被删除之前捕捉到它被卸载的事件吗?

【问题讨论】:

    标签: android homescreen android-launcher


    【解决方案1】:

    我不相信你能做到。

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

    其次,正如您所注意到的,您的应用程序receives no notification that it is being uninstalled

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


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

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

    【讨论】:

    • 请注意,“预安装”并不一定意味着“固件”。可以像安装普通应用程序一样安装应用程序,但恰好提前在设备上发布。例如,ARCHOS 5 Android 平板电脑通过十几个应用程序做到了这一点。
    • 确实如此。我正在使用在固件上安装应用程序的设备,所以我一定要提到固件部分。但我认为由于缺少 PACKAGE_REMOVED 广播,问题仍然存在。
    • 尽管您的评论促使我为非固件预安装添加了一个潜在的解决方案。 :)
    • Christopher,感谢您提供两个应用程序的想法,我会检查它是否适合我的应用程序。
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 听起来不错。哪个版本将包含新的启动器?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多