9

在我的应用程序中,我创建了一个启动Details Activity的通知。我想将此活动添加到当前任务(或回栈)的顶部。例如,我希望应用程序任务(回栈)的行为如下:

在此处输入图像描述

但我明白了:

在此处输入图像描述

我没有使用FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_NEW_TASK标志。我应该怎么办?

编辑:第一张图片只是一个例子。我认为问题的标题是完全明确的。我想在当前堆栈顶部添加Details Activity,而不是从新任务开始。

这就是我创建的方式PendingIntent

    // Details activity intent
    Intent intent = new Intent(context, DetailsActivity.class);
    intent.putExtra(Com.KEY_ID, event.getId());
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);

这是清单:

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name_system"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar">

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

    <activity
        android:name=".NoteActivity"
        android:label="@string/app_name_system"
        android:theme="@style/AppTheme.NoActionBar"
        android:windowSoftInputMode="stateHidden" />

    <activity
        android:name=".DetailsActivity"
        android:launchMode="singleTop"
        android:label="@string/app_name_system"
        android:theme="@style/AppTheme.NoActionBar" />
4

5 回答 5

4

我找到了这个链接:Preserving Navigation when Starting an Activity。虽然它没有为我的问题提供确切的解决方案,但它产生了预期的结果。

该链接描述了我们应该从DetailsActivity一个具有不同亲和力的新任务开始。

显现:

    <activity
        android:name=".DetailsActivity"
        android:excludeFromRecents="true"
        android:label="@string/app_name_system"
        android:launchMode="singleTop"
        android:taskAffinity=""
        android:theme="@style/AppTheme.NoActionBar" />

PendingIntent创建:

    Intent intent = new Intent(context, DetailsActivity.class);
    intent.putExtra(Com.KEY_ID, event.getId());
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
于 2017-02-09T19:42:48.557 回答
2

您可以使用PendingIntent.getActivities而不是PendingIntent.getActivity来构建您的堆栈。

Intent mainActivityIntent = new Intent(context,MainActivity.class);
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Intent noteActivityIntent= new Intent(context,NoteActivity.class);
noteActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Intent detailActivityIntent= new Intent(context,DetailActivity.class);

final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++,
            new Intent[] {mainActivityIntent,noteActivityIntent,detailActivityIntent},PendingIntent.FLAG_UPDATE_CURRENT);

这应该可以解决您的目的。

有关更多详细信息,请参阅此链接从通知创建的活​​动返回主要活动

于 2017-02-09T17:45:25.637 回答
1

您需要getActivities()在接受一组意图的第三个参数中使用并指定整个导航路径。您需要按照应用程序导航应该工作的顺序构建该数组,即最左边是根/主要活动,然后从那里进一步向下。

像这样的东西

Intent mainActivityIntent = new Intent(context, MainActivity.class);
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // only specify new task flag for MainActivity

Intent noteActivityIntent= new Intent(context,NoteActivity.class);

Intent detailsActivityIntent = new Intent(context, DetailsActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivities(context, 0,
            new Intent[] {mainActivityIntent,noteActivityIntent,detailsActivityIntent},PendingIntent.FLAG_UPDATE_CURRENT);

请注意:如果您的应用程序已经处于活动状态,一旦您按下返回,android 将带您返回您的NoteActivity然后MainActivity. 如果活动已经存在,它将重新启动活动,否则将创建新活动。

于 2017-02-09T17:54:45.213 回答
0

来自android 文档的解决方案可能对您有用。它对我有用,但我只有一个父子后栈。

与父母关系的清单:

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

<!-- MainActivity is the parent for NoteActivity-->
<activity
    android:name=".ResultActivity"
    android:parentActivityName=".MainActivity" />
    ...
</activity>

<!-- NoteActivity is the parent for DetailsActivity -->
<activity
    android:name=".DetailsActivity "
    android:parentActivityName=".NoteActivity " />
    ...
</activity>

创建待处理的意图:

// Create an Intent for the activity you want to start
Intent resultIntent = new Intent(this, DetailsActivity.class);

// Create the TaskStackBuilder and add the intent, which inflates the back stack
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(resultIntent);

// Get the PendingIntent containing the entire back stack
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
于 2020-02-27T19:11:17.817 回答
0

我想要完全相反的(这是默认行为)。

事实证明,设置noHistory="true"或/和调用finish()通知启动的活动,保留现有的后台堆栈。

所以基本上解决方案是要么不将 Activity 保留在后台堆栈中,要么创建一个不会保留的“NotificationActivity”,它将负责启动您想要的 Activity(在您的示例中为 DetailsActivity)。

于 2018-07-17T10:27:26.900 回答