我们的应用有不同的通知,可以打开不同的活动。所以我们创建了URI方案来实现这一点。收到通知并打开正确的活动。我使用以下代码创建用于正确导航的堆栈:
Intent intent = new Intent(Intent.ACTION_DEFAULT, Uri.parse(uri));
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addNextIntentWithParentStack(intent);
PendingIntent contentIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder mBuilder = new Notification.Builder(context);
mNotifM.notify(NotificationId.getID(), mBuilder.setStyle(new Notification.BigTextStyle(mBuilder)
.bigText(bigText)
.setBigContentTitle(title)
.setSummaryText(summaryText))
.setContentTitle(title)
.setSmallIcon(R.drawable.udechile_launcher)
.setContentText(summaryText)
.setAutoCancel(true)
.setContentIntent(contentIntent)
.setTicker(bigText)
.build());
问题是在Android 4.1.1中,重新创建堆栈的代码无法正常工作。我使它工作的唯一方法是在创建意图时引用类而不是uri:
intent = new Intent(context, MatchDetail.class);
问题在于我必须为每个uri做一个Switch-Case才能为每个类创建意图。这首先打败了URI的目的。 此外,如果将来我需要添加一个新的推送目标不只是在AndroidManifest.xml中添加URI我必须在推送通知接收器的交换机中添加新的情况。
有人知道如何在Android 4.1.1中使用URI进行此工作吗?
清单摘录:
<activity
android:name=".controller.MatchDetail"
android:label="@string/title_activity_match_detail"
android:parentActivityName=".controller.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".controller.MainActivity" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="scheme" android:host="base" android:path="/name" />
</intent-filter>
</activity>
答案 0 :(得分:1)
我还没有尝试过这个,但这可能会解决你的问题:
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(Class.forName(intent.getComponent().getClassName()));
stackBuilder.addNextIntent(intent);
如果这不起作用,请尝试:
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addNextIntent(context, Class.forName(intent.getComponent().getClassName()));
stackBuilder.addNextIntent(intent);
还有一个尝试:
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addNextIntentWithParentStack(new Intent(context, Class.forName(intent.getComponent().getClassName())));
修改强>
找到一种可行的新方法,希望
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(new ComponentName(context, Class.forName(intent.getComponent().getClassName())));
stackBuilder.addNextIntent(intent);