Android - 构建通知,TaskStackBuilder.addParentStack不能正常工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android - 构建通知,TaskStackBuilder.addParentStack不能正常工作相关的知识,希望对你有一定的参考价值。
我正在尝试从android docs说明的通知中启动活动,但是当我打开通知然后按后退按钮时,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);
您需要为要启动的活动添加父堆栈,而不是其父项。
更换:
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>
如果在项目中使用代码生成(如Dagger),MainActivity.class应替换为MainActivity_.class(或者您的父活动名称)。花了我一整天来弄明白这一点。希望这可以拯救某人的一天。
如果您在manifest中的活动有下一个launchMode,也会发生这种情况:
<activity android:name=".SecondActivity"
...
android:launchMode="singleInstance"
android:parentActivityName=".MainActiviy"
...
/>
如果没有一个解决方案正在运行,并且您确定已经仔细地遵循了所有内容......那么您需要卸载该应用并重新安装它。为我工作!
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);
这解决了Notification Click上父堆栈的问题
使用TaskStackBuilder并没有解决我的问题,只适用于Honeycomb和更高版本。所以我采取以下解决方案(请不要将我钉在十字架上):
- 调用
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();
在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)));
}
...
}
对我来说,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);
您是否查看了Android文档,特别是Notifications API指南。它详细描述了如何执行此操作。
请注意,如果您从通知开始的活动不是正常活动流程的一部分,那么它不应该转到应用程序的开始页面;相反,它应该转到主屏幕。
如其他答案中所述,TaskStackBuilder不适用于Honeycomb以下的版本。
我的解决方案是覆盖活动的onBackPressed()
方法。
@Override
public void onBackPressed() {
NavUtils.navigateUpFromSameTask(this);
}
显然,如果你计划以其他方式完成活动,你也必须处理这个问题。 (虽然我认为压倒finish()
会有一些意想不到的行为)。
您应该将此添加到AndroidManifest上的MainActivity:
<activity
android:name=".MainActivity"
android:allowTaskReparenting="true" />
我有同样的问题!解决:
切换到
PendingIntent resultPendingIntent =
PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
以上是关于Android - 构建通知,TaskStackBuilder.addParentStack不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Android - 构建通知,TaskStackBuilder.addParentStack不能正常工作
是否可以在不构建任何应用程序的情况下向 Android 发送推送通知?
无法在构建 Android 应用程序中获取博览会推送通知令牌。 (在开发环境中工作)