为什么我们在创建通知时使用TaskStackBuilder
?我没有得到它背后的逻辑。
有人可以解释一下。
public void showText(final String text){
Intent intent = new Intent (this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(getString(R.string.app_name))
.setAutoCancel(true)
.setPriority(Notification.PRIORITY_MAX)
.setDefaults(Notification.DEFAULT_VIBRATE)
.setContentIntent(pendingIntent)
.setContentText(text)
.build();
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICACTION_ID, notification);
}
答案 0 :(得分:53)
假设您有一个发送应用程序的电子邮件,并且您有两个活动。一个是MainActivity
,其中包含电子邮件列表,另一个用于显示电子邮件(EmailViewActivity
)。现在,当您收到新电子邮件时,您会在状态栏上显示通知。现在,您希望在用户点击该电子邮件时查看该电子邮件,并且在用户单击后退按钮后显示该电子邮件时,您希望显示该电子邮件列表活动(MainActivity
)。对于这种情况,我们可以使用TaskStackBuilder
。见下面的例子:
public void showEmail(final String text){
Intent intent = new Intent (this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(intent);
Intent intentEmailView = new Intent (this, EmailViewActivity.class);
intentEmailView.putExtra("EmailId","you can Pass emailId here");
stackBuilder.addNextIntent(intentEmailView);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(getString(R.string.app_name))
.setAutoCancel(true)
.setPriority(Notification.PRIORITY_MAX)
.setDefaults(Notification.DEFAULT_VIBRATE)
.setContentIntent(pendingIntent)
.setContentText(text)
.build();
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICACTION_ID, notification);
}
希望你能理解。
请点击以下网址了解详情: http://developer.android.com/reference/android/support/v4/app/TaskStackBuilder.html http://developer.android.com/guide/components/tasks-and-back-stack.html http://www.programcreek.com/java-api-examples/index.php?api=android.app.TaskStackBuilder
答案 1 :(得分:4)
我们使用TaskStackBuilder
确保在活动开始时后退按钮能够播放。 TaskStackBuilder
允许您访问后退按钮使用的活动历史记录。基本上,当我们希望用户在按下后退按钮后导航到另一个活动时,我们会使用它。
答案 2 :(得分:1)
其他答案很好地解释了:您使用待定意图将用户发送到详细活动,然后您希望他们使用后退按钮返回主活动。另一种设置此is
的方法Intent detailIntentForToday = new Intent(context, DetailActivity.class); TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context); taskStackBuilder.addNextIntentWithParentStack(detailIntentForToday); PendingIntent resultPendingIntent = taskStackBuilder .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); resultPendingIntent.send();
为此,您还需要设置
android:parentActivityName=".MainActivity"
代表DetailActivity
中的AndroidManifest.xml
。
答案 3 :(得分:1)
1)通过“应用”图标(普通流)
启动应用时
2)当应用程序通过某些通知启动时
应用中导航的一般流程为 MainActivity-> DetailActivity
但是有时Notification
可能会直接打开DetailActivity
。在这种情况下,按DetailActivity
中的“后退”按钮不会导致您进入“ MainActivity”。这是预期的行为。但是,如果您想导航回MainActivity,则可以对其进行修改。
1)在您的活动中添加android:parentActivityName =“ com.example.myApp.MainActivity
此功能已在Android 4.1中添加。因此,如果您要定位较早的设备。添加元标记还。
<activity android:name=".Activities.DetailActivity"
android:parentActivityName=".Activities.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".Activities.MainActivity" />
</activity>
2)使用TaskStackBuilder创建待处理的意图。
public PendingIntent getPendingIntent(Intent intent){
TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this);
taskStackBuilder.addNextIntentWithParentStack(intent);
PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
}
现在传递此挂起的意图来创建通知。
答案 4 :(得分:0)
我遇到了同样的问题,并且以这种方式解决了:
如前所述,我添加了
height: 100%
在我的AndroidManifest文件中。
我还向每个类添加了 onResume
我使用TaskStackBuilder创建了一个待处理的意图:
Intent intent = new Intent(context,myClass); TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context); taskStackBuilder.addNextIntentWithParentStack(intent); PendingIntentendingIntent = taskStackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
答案 5 :(得分:0)
我知道已经有一段时间了,但是我遇到了这个问题,这一次,我的堆栈有几个层次的深度。看看这里的好答案,我当然可以推断出3个等级或更高的水平。看起来很直截了当,但对于我来说,它一开始并不像以前那样,因为我将三倍的后堆栈进行了三倍处理。希望它能帮助某人。确保正确设置Manifest.xml
无论如何,对于具有多个级别的用户来说,这很好用:
Intent level3Intent = new Intent(this, Level3.class);
level3Intent.putExtra(YOUR STUFF);
Intent level2Intent = new Intent(this, Level2.class);
//level2Intent.putExtra(YOUR STUFF);
Intent level1Intent = new Intent(this, MainActivity.class);
// Get the PendingIntent containing the entire back stack with the needed extras
PendingIntent pendingIntent =
TaskStackBuilder.create(this)
.addParentStack(MainActivity.class)
.addNextIntent(level1Intent)
.addNextIntent(level2Intent)
.addNextIntent(level3Intent)
.getPendingIntent(requestCode, PendingIntent.FLAG_UPDATE_CURRENT);
return new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID)
.setContentTitle(notification_title)
.setContentText(notification_msg)
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(notification_msg))
.setSmallIcon(R.drawable.ic_sea)
.setDefaults(Notification.DEFAULT_SOUND)
.setWhen(System.currentTimeMillis())
.setGroup(OWS_GROUP)
.setAutoCancel(true)
.setContentIntent(pendingIntent);