Android 活动意图将另一项活动带到前台

Android 活动意图将另一项活动带到前台,android,android-intent,android-activity,Android,Android Intent,Android Activity,我正在创建自定义应用程序快捷方式的意图,如下所示: Intent.ShortcutIconResource icon = ...; Intent intent = new Intent(); Intent launchIntent = new Intent(getThis(), HandleShortcutActivity.class); // add a few user settings public class HandleShortcutActivity extends AppComp

我正在创建自定义应用程序快捷方式的意图,如下所示:

Intent.ShortcutIconResource icon = ...;
Intent intent = new Intent();
Intent launchIntent = new Intent(getThis(), HandleShortcutActivity.class);
// add a few user settings
public class HandleShortcutActivity extends AppCompatActivity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_helper);

        // get data from intent
        // ...
        // handle the action
        // ...

        // finish this activity instantly again
        finish();
    }
}
该活动处理如下意图:

Intent.ShortcutIconResource icon = ...;
Intent intent = new Intent();
Intent launchIntent = new Intent(getThis(), HandleShortcutActivity.class);
// add a few user settings
public class HandleShortcutActivity extends AppCompatActivity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_helper);

        // get data from intent
        // ...
        // handle the action
        // ...

        // finish this activity instantly again
        finish();
    }
}
这是我的清单:

<activity
    android:name=".activities.MainActivity"
    android:windowSoftInputMode="adjustPan"
    android:launchMode="singleTask"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".activities.HandleShortcutActivity"
    android:configChanges="orientation|screenSize"
    android:excludeFromRecents="true"
    android:noHistory="true"
    android:theme="@style/Theme.Transparent"
    android:launchMode="singleTask">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>

</activity>

问题


如果
MainActivity
正在后台运行,并且我的快捷方式意图已启动,则我的
MainActivity
应该放在前面。为什么?如何避免这种情况?

从清单文件中的
活动
声明中删除
android:launchMode=“singleTask”

此启动模式搜索任务堆栈中的
Activity
,如果可用,则从堆栈中获取,而不是创建
MainActivity

的新实例更新清单

<activity
    android:name=".activities.MainActivity"
    android:windowSoftInputMode="adjustPan"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

此处需要设置“任务关联”,以便将任务创建为与
main活动无关的新堆栈的一部分。然后,当您
finish()
it时,它将关闭
HandleShortcutActivity
,而不是“返回”到
main活动

以下为:

android:taskAffinity

活动与之有关联的任务。与联合国的活动 从概念上讲,相同的亲缘关系属于相同的任务(属于相同的 “应用程序”(从用户的角度)。任务的相关性是 由其根活动的亲和力决定。亲和力 确定两件事—活动重新设置父级的任务 (请参见allowTaskReparenting属性)和将包含的任务 启动时带有标志“活动”\u“新建任务”标志的“活动”

默认情况下,应用程序中的所有活动都具有相同的关联性。 您可以设置此属性以对其进行不同的分组,甚至放置 在同一任务的不同应用程序中定义的活动。到 指定该活动不具有任何任务的关联性,设置 将其转换为空字符串

如果未设置此属性,则活动将继承关联集 对于应用程序(请参见元素的taskAffinity 属性)。应用程序的默认关联的名称是 由元素设置的包名称

添加taskAffinity后,清单文件中的HandleShortcutActivity:

<activity
    android:name=".activities.HandleShortcutActivity"
    android:configChanges="orientation|screenSize"
    android:excludeFromRecents="true"
    android:noHistory="true"
    android:theme="@style/Theme.Transparent"
    android:launchMode="singleTask"
    android:taskAffinity="">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>

</activity>


我发现在理解不同的Android启动模式时非常有用,并且非常连贯地解释了您可能面临的各种场景。

为什么您要完成();您在onCreate()?@MohdSaquib中的活动,因为快捷方式操作已被处理,并且不需要任何类似活动的可视界面问题在于清单代码删除android:launchMode=“singleTask”