62

我正在尝试从 Android 文档解释的通知启动活动,但是当我打开通知然后按后退按钮时,HomeActivity(父级)没有打开,而是应用程序关闭。我究竟做错了什么?

    Intent resultIntent = new Intent(context, MatchActivity.class);;
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);

    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(MainActivity.class);

    stackBuilder.addNextIntent(resultIntent);
4

11 回答 11

99

您需要为要启动的活动添加父堆栈,而不是它的父堆栈。

代替:

stackBuilder.addParentStack(MainActivity.class);

和:

stackBuilder.addParentStack( MatchActivity.class );

这假设您已经在 Manifest (API 16+) 中定义了父级:

<activity android:name=".MatchActivity"
    android:parentActivityName=".MainActivity"
    ... />

如果您在 API 16 下进行开发,则必须将父级定义为:

<activity android:name=".MatchActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>
于 2012-11-29T18:45:04.420 回答
83

如果所有解决方案都不起作用,并且您确定您已仔细遵循所有操作...那么您需要卸载该应用程序并重新安装它。为我工作!

于 2016-03-20T05:59:09.953 回答
15
Intent resultIntent = new Intent(App.getContext(), TargetActivity.class);
Intent backIntent = new Intent(App.getContext(), ParentActivity.class);
backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
final PendingIntent resultPendingIntent = PendingIntent.getActivities(
                                    App.getContext(), 0, 
               new Intent[]{backIntent, resultIntent}, PendingIntent.FLAG_ONE_SHOT);
mNotifyBuilder.setContentIntent(resultPendingIntent);

这解决了我在通知点击时的父堆栈问题

于 2015-10-19T09:25:46.313 回答
8

使用TaskStackBuilder并没有解决我的问题,只适用于 Honeycomb 和更大。所以我采取以下解决方案(请不要把我钉在十字架上):

  1. 调用MainActivity而不是MatchActivity,作为参数传递MatchActivity(通过 Intent)。
  2. 在中,如果参数可用,则MainActivity.onCreate启动。MatchActivity

新代码:

Intent resultIntent = new Intent(context, MainActivity.class) //
        .putExtra(MainActivity.ACTIVITY_EXTRA, MatchActivity.class.getName()) //
        .putExtra("Pass extras to MatchActivity", "if you want! :)");

PendingIntent pendingIntent = PendingIntent.getActivity(context, visitId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification notification = new NotificationCompat.Builder(context) //
            .setContentIntent(pendingIntent) //
            .build();

MainActivity

public static final String ACTIVITY_EXTRA = "activity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getIntent().getStringExtra(ACTIVITY_EXTRA) != null) {
        startActivity(new Intent(getIntent()).setClassName(this, getIntent().getStringExtra(ACTIVITY_EXTRA)));
    }
    ...
}
于 2013-11-28T19:14:48.817 回答
3

对我来说 stackBuilder.addParentStack 没有用。

我最终这样做了,希望这可以帮助你。

    Intent intent = new Intent(context, MatchActivity.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    // Adds the back stack for the Intent
    stackBuilder.addNextIntentWithParentStack(new Intent(context, MainActivity.class));
    stackBuilder.addNextIntent(intent);
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
于 2016-07-17T16:59:20.540 回答
2

您是否查看过 Android 文档,特别是 Notifications API 指南。它详细描述了如何执行此操作。

请注意,如果您从通知启动的 Activity 不是正常 Activity 流程的一部分,则它不应转到应用程序的起始页;相反,它应该转到主屏幕。

于 2012-11-29T21:05:34.203 回答
2

您应该将此添加到 AndroidManifest 上的 MainActivity:

<activity
   android:name=".MainActivity"
   android:allowTaskReparenting="true" />
于 2015-11-09T01:26:19.527 回答
1

如其他答案所述,TaskStackBuilder 不适用于 Honeycomb 以下的版本。

我的解决方案是覆盖活动的onBackPressed()方法。

@Override
public void onBackPressed() {
    NavUtils.navigateUpFromSameTask(this);
}

显然,如果您计划以其他方式完成活动,您也必须处理它。(虽然我想覆盖finish()会有一些意想不到的行为)。

于 2014-05-15T09:55:16.983 回答
0

我有同样的问题!解决:

切换到

PendingIntent resultPendingIntent = 

PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent resultPendingIntent = 

stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
于 2014-09-05T13:49:30.840 回答
0

如果清单中的 activiti 有下一个launchMode ,也会发生这种情况:

<activity android:name=".SecondActivity"
     ...
         android:launchMode="singleInstance"
         android:parentActivityName=".MainActiviy"
    ...
/>
于 2017-12-20T17:30:04.770 回答
0

如果您在项目中使用代码生成(如 Dagger),则应将 MainActivity.class 替换为 MainActivity_.class(或任何您的父活动名称)。我花了一整天的时间才弄清楚这一点。希望这可以挽救某人的一天。

于 2017-02-20T12:20:59.217 回答