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(请不要把我钉十字架):
- 调用
MainActivity
而不是MatchActivity
,传递MatchActivity
作为参数(通过Intent)。 - 在
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(或者你的父活动名称)代替。 花了整整一天的时间来弄清楚这一点。 希望这可以节省一些人的一天。