返回通知创建活动的主要活动

时间:2012-12-10 12:10:24

标签: android

我正在尝试实现here所描述的行为,其中通知(或其他)在您的应用中启动“内部”活动,然后当用户按下它时进入我的“主页”活动。

Android文档说

  

如果是“后退”按钮,则应进行更多导航   可预测的 通过插入任务的后台堆栈完成   应用程序最顶层屏幕的向上导航路径 。这允许用户   谁忘记了他们如何进入你的应用程序导航到应用程序   退出前的最顶层屏幕。

有没有一个好方法可以实际做到这一点?关于Stackoverflow的其他问题建议启动主要活动,意图告诉它开始内部活动,但这似乎是一个巨大的黑客,我有点怀疑谷歌会在Gmail中使用,我认为有一个不错的方法,给定他们提倡这种行为。

那么有一种非黑客的方法吗?

10 个答案:

答案 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)

我知道实现这个目标的两种方法:

  1. 从通知开始的活动中开始home activity。这可能会变得非常棘手,因为您必须区分并跟踪各种可能的切入点。
  2. 您始终从home activity开始,检查是否通过通知启动,然后启动notification activity。这确保了一致的入口点,当用户按下向上键时,后面的堆栈就会出现。
  3. 问候。

答案 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_TASKIntent.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);