如何将应用程序的快捷方式添加到主屏幕

20

我知道这并没有被记录下来并且不会在每个设备上都起作用,但我看到越来越多的应用程序在安装后将它们的快捷方式放在主屏幕上。

发现了一堆如何做到这一点的代码块,但对于我来说它们不太合适。

这就是我目前所拥有的。

  1. 需要在清单文件中添加一个权限。

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
  • 创建应该被调用的活动的Intent。例如(来自cgeek):

  • Intent shortcutIntent = new Intent();
    shortcutIntent.setClassName("com.example.androidapp", "SampleIntent");
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
  • 创建快捷方式本身

  • Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Shortcut Name");
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(context, R.drawable.icon));
    addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    context.sendBroadcast(addIntent);
    
    我的问题是:为了在.apk安装后添加快捷方式,这段代码应该放在哪里?我在启动器活动中尝试了这段代码,但每次应用程序启动时都会创建一个不可用的快捷方式(另一个故事)。

    作为用户,我也同意这是非常烦人的。但是作为开发者,如果被要求这样做,并且我已经解释过不能这样做,但仍然坚持让我这样做。是的,在ICS之后你可以这样做。权限是必要的,其他情况请参考此答案:https://dev59.com/VmMl5IYBdhLWcg3wiXZ7#18327304 - yahya
    这个答案在KitKat上不起作用... - Noman
    4个回答

    20
    据我所知,这是市场应用的可选功能,而不是应用程序本身的功能。按设计,应用程序不会接收有关其自身已安装的广播。如果该代码有效,则最早可以执行它的时间是用户启动应用程序的第一次。也就是说:

    不要自动创建应用程序快捷方式。

    永远不要。

    不要篡夺用户的UI设计。


    4
    "不要自动创建应用程序快捷方式。" 我不同意。Viber 就是这样做的,而且 Viber 并不像那样邪恶。这是有用的,因为Viber 的目标用户并不是技术专家。他们不知道如何管理主屏幕。这是事实。" - Felipe
    6
    在众多应用中,有一个特殊情况并不足以忽视一个相当基本且无争议的经验法则。如果用户不知道如何管理他们的主屏幕,那么更加不应该将他们不知道如何删除的东西放在那里。 - LeffelMania
    7
    很厌烦有些人总是自以为比别人更懂,说些类似“不要这样做,不要那样做,这是邪恶的”之类的话。 - Alex
    4
    重点是,Android 不仅仅用于智能手机或平板电脑(有成千上万的设备!)。还有其他情况下,你可以为 Android 开发应用程序,甚至有时完全不使用市场。在通常情况下所谓的恶意行为,在某些情况下可能有非常好的理由。这也适用于 Android 开发团队:声明在通常情况下不应该做某事,并不是限制 API 在特定点上的借口。这违背了我们对于一个好的 API & OS 所期望的灵活性。 - Alex
    看起来不再允许了:“应用程序及其广告不得修改或添加浏览器设置或书签,添加主屏幕快捷方式或用户设备上的图标,作为向第三方提供服务或进行广告宣传的手段。”但是由于最后一句话,我不确定。(来自新政策:http://play.google.com/intl/en/about/developer-content-policy.html) - Samuel
    显示剩余3条评论

    4

    我同意目前被接受的答案,即不应在接收广播或安装时执行此操作。未经用户交互或许可不要做任何事情。

    但是,如果您在应用程序中提供一个按钮,则应将其放在按钮的OnClick处理程序中。然后,当用户选择“添加快捷方式”选项时,它将添加一个快捷方式。


    2
    这可以做到,只需在oncreate方法中将下面的代码添加到您的主活动中。
            Intent HomeScreenShortCut= new Intent(getApplicationContext(),
                    MainActivity.class);
    
            HomeScreenShortCut.setAction(Intent.ACTION_MAIN);
            HomeScreenShortCut.putExtra("duplicate", false);
            //shortcutIntent is added with addIntent
            Intent addIntent = new Intent();
            addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, HomeScreenShortCut);
            addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "AppName");
            addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
                Intent.ShortcutIconResource.fromContext(getApplicationContext(),
                            R.drawable.ic_launcher));
    
            addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); 
    
            getApplicationContext().sendBroadcast(addIntent);
    

    请在您的清单中添加此权限。
     <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    

    它添加了快捷方式,但如果您尝试使用它打开应用程序,则会发送一个toast消息“应用程序未安装”。我在这里漏掉了什么吗?谢谢。 - Gabi Radu

    0

    我使用了这段代码在主页上创建了3个快捷方式:

    Intent HomeScreenShortCut= new Intent(getApplicationContext(),
                MainActivity.class);
    
    HomeScreenShortCut.setAction(Intent.ACTION_MAIN);
    HomeScreenShortCut.putExtra("duplicate", false);
    //shortcutIntent is added with addIntent
    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, HomeScreenShortCut);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "AppName");
    addIntent.putExtra(
        Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
        Intent.ShortcutIconResource.fromContext(
            getApplicationContext(),
            R.drawable.ic_launcher
        )
    );
    
    addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); 
    
    getApplicationContext().sendBroadcast(addIntent);
    

    “duplicate”是什么意思? - android developer
    @androiddeveloper 这是为了避免重复图标(如果主屏幕上已经存在图标,则不会创建图标)。 - Fernando Pardo
    我不知道这个。你从哪里找到这个参数的信息?你还知道其他的吗? - android developer
    请问,如何正确地使用另一个应用程序的图标创建快捷方式?显然不能使用ShortcutIconResource... - android developer

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