Android动态快捷方式第二次没有打开正常活动

时间:2017-09-07 12:37:30

标签: android android-activity shortcuts android-static-shortcuts android-dynamic-shortcuts

您好我正在为Android应用程序开发快捷方式。我的代码看起来像

txt

我的清单看起来像这样:

private void setShortMenu() {

    ArrayList<ShortcutInfo> shortcutInfos = new ArrayList<>();

    Intent intent = new Intent(this, SampleActivity2.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.putExtra("val",1);
    intent.addCategory("android.shortcut.conversation");
    ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

    ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id2")
            .setShortLabel("Web site")
            .setLongLabel("Open the web site")
            .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
            .setIntent(intent)
            .build();
    shortcutInfos.add(shortcut);

    Intent intent2 = new Intent(this, SampleActivity3.class);
    intent2.setAction(Intent.ACTION_VIEW);
    intent.addCategory("android.shortcut.conversation");
    intent.putExtra("val",2);

    ShortcutInfo shortcut2 = new ShortcutInfo.Builder(this, "id1")
            .setShortLabel("Web site...")
            .setLongLabel("Open the web site...")
            .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
            .setIntent(intent2)
            .build();
    shortcutInfos.add(shortcut2);

    shortcutManager.setDynamicShortcuts(shortcutInfos);
}

此代码的问题是这样的。我从后台杀了应用程序。单击第一个快捷方式。它会打开<application android:name=".SampleApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!--<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />--> </activity> <activity android:name=".SampleActivity" /> <activity android:name=".SampleActivity2" /> <activity android:name=".SampleActivity3"></activity> 。我通过单击主页按钮并单击第二个快捷方式来最小化应用程序。它会打开SampleActivity2。直到这一点,一切都是正确的。但现在,如果我点击第一个菜单或第二个菜单,它总是打开SampleActivity3,这是最后一次最小化的活动。 如果我用静态的快捷方式做同样的事情那么它工作正常:

SampleActivity3

在清单中我补充道:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
    android:shortcutId="compose"
    android:enabled="true"
    android:icon="@mipmap/ic_launcher"
    android:shortcutShortLabel="@string/compose_shortcut_short_label1"
    android:shortcutLongLabel="@string/compose_shortcut_short_label1"
    android:shortcutDisabledMessage="@string/compose_shortcut_short_label1">
    <intent
        android:action="android.intent.action.VIEW"
        android:targetPackage="com.example.nilkash.shortcutmenu"
        android:targetClass="com.example.nilkash.shortcutmenu.SampleActivity2" >
        <extra android:name="val" android:value="1" />
    </intent>
    <categories android:name="android.shortcut.conversation" />
</shortcut>

<shortcut
    android:shortcutId="compose1"
    android:enabled="true"
    android:icon="@mipmap/ic_launcher"
    android:shortcutShortLabel="@string/compose_shortcut_short_label2"
    android:shortcutLongLabel="@string/compose_shortcut_short_label2"
    android:shortcutDisabledMessage="@string/compose_shortcut_short_label2">
    <intent
        android:action="android.intent.action.VIEW"
        android:targetPackage="com.example.nilkash.shortcutmenu"
        android:targetClass="com.example.nilkash.shortcutmenu.SampleActivity3" >
        <extra android:name="val" android:value="2" />
    </intent>
    <categories android:name="android.shortcut.conversation" />
</shortcut>

我的代码有什么问题。需要一些帮助。谢谢。

1 个答案:

答案 0 :(得分:4)

这可以在您发布清单后确认,但我猜测发生了以下情况:

当您使用第一个快捷方式时,Android会为您的应用创建新任务,并在任务中启动SampleActivity2。然后按HOME,它只将此任务发送到后台。

现在使用第二个快捷方式。由于SampleActivity3taskAffinity具有相同的SampleActivity2,因此Android会将包含SampleActivity2的现有任务带到前台,并将SampleActivity3启动到该任务中。您的任务现在包含SampleActivity2 - &gt; SampleActivity3。您现在再次按HOME。任务移至后台。

如果您现在使用第一个快捷方式,Android会识别您正在尝试启动&#34; root&#34;现有任务的Activity,只是将现有任务带到前台,不会向其中启动任何新Activity。该任务包含SampleActivity2 - &gt; SampleActivity3,因此您会看到SampleActivity3,因为这是任务中的顶级Activity。此行为与您运行Whatsapp时按下HOME,然后按HOME屏幕上的Whatsapp图标完全相同。这并没有从一开始就启动Whatsapp&#34;它只是将包含Whatsapp的当前任务带到前台,无论它在移动到后台时处于什么状态。

如果您现在按HOME并使用第二个快捷方式,Android会使用与taskAffinity相同的SampleActivity3找到您的任务,并将现有任务带到前台。 Android现在不执行任何操作(如果SampleActivity3具有launchMode="singleTop")或创建SampleActivity3的新实例并将其启动到任务中。在这种情况下,您的任务将包含3个Activity个实例:SampleActivity2 - &gt; SampleActivity3 - &gt; SampleActivity3,您会看到SampleActivity3,因为这是顶级任务中Activity

注意:从下面的评论讨论中可以看出,重要的是要添加

addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
如果您想确保创建Intent的新实例,请

到用于启动Activity的{​​{1}}。否则,Android会将现有任务带到前台,并且不会启动任何新的Activity