在我的应用程序中,我创建了一个启动详细信息活动的通知。我想将此活动添加到当前任务(或后台堆栈)之上。例如,我希望应用程序任务(后台堆栈)的行为如下:
但我明白了:
我没有使用FLAG_ACTIVITY_CLEAR_TASK
和FLAG_ACTIVITY_NEW_TASK
标志。我该怎么办?
编辑:第一张图片只是一个例子。我认为问题的标题是完全明确的。我想在当前堆栈的顶部添加详细信息活动,而不是从新任务开始。
这就是我创建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" />
答案 0 :(得分:3)
您可以使用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);
这应该可以解决你的目的。
有关详细信息Back to main activity from notification-created activity
,请参阅此链接答案 1 :(得分: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
。如果活动已经存在,它将重新启动活动,否则将创建新活动。
答案 2 :(得分:1)
我找到了这个链接: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);
答案 3 :(得分:0)
我想要正好相反(这是默认行为)。
事实证明,在通知启动的活动上设置noHistory="true"
或/和调用finish()
可以保留现有的堆栈。
因此,基本上,解决方案是不将活动保留在后台或创建“ NotificationActivity”,该活动将不保留并负责启动所需的活动(示例中为DetailsActivity)。
答案 4 :(得分:0)
android docs中的解决方案可能适合您。它对我有用,但是我只有一个亲子背堆栈。
与父母有关系的清单:
<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);