我正在尝试实现here所描述的行为,其中通知(或其他)在您的应用中启动“内部”活动,然后当用户按下它时进入我的“主页”活动。
Android文档说
如果是“后退”按钮,则应进行更多导航 可预测的 通过插入任务的后台堆栈完成 应用程序最顶层屏幕的向上导航路径 。这允许用户 谁忘记了他们如何进入你的应用程序导航到应用程序 退出前的最顶层屏幕。
有没有一个好方法可以实际做到这一点?关于Stackoverflow的其他问题建议启动主要活动,意图告诉它开始内部活动,但这似乎是一个巨大的黑客,我有点怀疑谷歌会在Gmail中使用,我认为有一个不错的方法,给定他们提倡这种行为。
那么有一种非黑客的方法吗?
答案 0 :(得分:67)
啊哈,我只需要使用PendingIntent.getActivities()
代替getActivity()
。另外值得一提的是TaskStackBuilder
以下是一些代码:
Intent backIntent = new Intent(ctx, MainActivity.class);
backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent intent = new Intent(ctx, ConversationActivity.class);
intent.putExtra("whatever", whatever);
final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++,
new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT);
刚试过它。它就像一个魅力。我最初怀疑如果应用程序已经运行可能会出现问题,并且您会收到通知。即说活动堆栈是(最右边的):
[MainActivity] [SomeActivity]
然后点击ConversationActivity
的通知。你会得到:?
[MainActivity] [SomeActivity] [MainActivity] [ConversationActivity]
嗯,事实证明你神奇地得到了
[MainActivity] [SomeActivity] [ConversationActivity]
这是我想要的,但我不知道它是如何做到的。我没有在任何活动上设置任何特殊选项。哦,好吧!
答案 1 :(得分:4)
有一个关于如何做到这一点的新指南,它提出了一些与上述答案略有不同的做法:
https://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse
注意,请勿在{{1}}中使用0
作为您的requestCode。对我来说,任何数字都不是0,但0导致后退按钮才能进入发射器。
答案 2 :(得分:1)
我知道实现这个目标的两种方法:
home activity
。这可能会变得非常棘手,因为您必须区分并跟踪各种可能的切入点。home activity
开始,检查是否通过通知启动,然后启动notification activity
。这确保了一致的入口点,当用户按下向上键时,后面的堆栈就会出现。问候。
答案 3 :(得分:1)
此解决方案可以很好地解决此问题
android:noHistory="true"
答案 4 :(得分:1)
答案 5 :(得分:0)
尼斯。
但请注意,这不适用于3.0之前的版本(API级别11级别)系统,因为PendingIntent.getActivities()在那里不可用。
构建一个从通知中访问活动的后台堆栈(通过Intent)并使后退按钮与您的应用程序协调一致(例如,详细活动返回列表活动)也是如此。
答案 6 :(得分:0)
活动与任务相关联,该任务只是后台堆栈中的一组活动。单击通知后打开新活动时,该活动将作为独立活动打开并进入新任务。这意味着仅存在通知活动和父活动。
只需在清单文件中将活动的启动模式指定为“标准”,它就可以解决问题。
Intent resultIntent = new Intent(getApplicationContext(),
ResultActivity.class);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(getApplicationContext(),0,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notId, mBuilder.build());
清单:
<activity
android:name="com.mns.exercisenotifications.ResultActivity"
android:label="@string/app_name"
android:launchMode="standard" > <---
<intent-filter>
<action android:name="com.mns.exercisenotifications.ResultActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
答案 7 :(得分:0)
Intent displayIntent = new Intent(getApplicationContext(), TargetActivity.class);
displayIntent.putExtra("extra_id","extra_key");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
stackBuilder.addParentStack(TargetActivity.class);
stackBuilder.addNextIntent(displayIntent);
stackBuilder.editIntentAt(1).putExtra("extra_id","extra_key");
PendingIntent contentIntent =
stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
getApplicationContext(), "123").setSmallIcon(R.drawable.logo)
.setContentTitle("GCM Notification")
.setStyle(new
NotificationCompat.BigTextStyle().bigText("Sample")).setContentText("sample text");
mBuilder.setContentIntent(contentIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(456, mBuilder.build());
stackBuilder.startActivities();
In addition to the above code also provide appropriate parent class names in your AndroidManifest.xml file.
答案 8 :(得分:0)
只需将此行添加到清单中即可。
<activity
android:name=".YourActivity"
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true">
</activity>
有关完整指南,请参见https://developer.android.com/training/notify-user/navigation
答案 9 :(得分:0)
我知道我来晚了,但这可能会帮助某人。
只需为要使用通知打开的活动创建一个意图。
然后将Intent.FLAG_ACTIVITY_NEW_TASK
和Intent.FLAG_ACTIVITY_CLEAR_TASK
设置为标志。
然后,您要做的就是创建一个PendingIntent
,其意图是作为参数。
这是一个代码示例:
Intent intent = new Intent(this, NotificationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);