Android – build立通知,TaskStackBuilder.addParentStack不能正常工作

我试图从Android文档解释通知启动一个活动,但是当我打开通知,然后按后退button,HomeActivity(父)不会打开,而是应用程序closures。 我究竟做错了什么?

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); 

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

更换:

 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> 

如果没有任何解决scheme正在工作,并且您确定您已经仔细地遵循了一切…那么您需要卸载该应用程序并重新安装它。 为我工作!

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

  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(); 

主要活动:

 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))); } ... } 
 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); 

这解决了我在通知单击上的父堆栈的问题

你看过Android文档,特别是通知 API指南。 它描述了如何详细地做到这一点。

请注意,如果从通知开始的活动不是正常活动stream程的一部分,则不应该进入应用程序的开始页面; 相反,它应该转到主屏幕。

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

我的解决scheme是重写活动的onBackPressed()方法。

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

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

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

 <activity android:name=".MainActivity" android:allowTaskReparenting="true" /> 

对我来说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); 

我有同样的问题! 解决:

切换到

 PendingIntent resultPendingIntent = PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

如果你在你的项目中使用代码生成(比如Dagger),MainActivity.class应该被MainActivity_.class(或者你的父活动名称)代替。 花了整整一天的时间来弄清楚这一点。 希望这可以节省一些人的一天。