原文地址:http://android.xsoftlab.net/training/notify-user/navigation.html
设计通知时要考虑到用户所预想的导航体验。通常有以下两种情况:
常规的Activity(Regular activity)
- 这里所启动的Activity是作为应用程序的正常流程部分出现的。
指定的Activity(Special activity)
- 用户只会看到这个Activity,如果这个Activity是从通知启动的话。在直觉上,这个Activity是用来展示通知上的详细信息的。
设置常规的Activity
设置启动常规的Activity需要执行以下步骤:
- 1.在清单文件中定义Activity的层级,最终的清单文件应该是这样的:
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ResultActivity"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
- 2.创建一个基于回退栈的Intent,它用来启动父Activity(下面的代码可能有误,请自行验证。):
int id = 1;
...
Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ResultActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
...
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(id, builder.build());
设置启动指定的Activity
启动指定的Activity不需要回退栈,所以不需要在清单文件中定义Activity的层级,也不需要在代码中使用addParentStack()构建回退栈。相反的,使用清单文件来设置Activity的任务模式,并通过getActivity()创建PendingIntent就可以完成创建。
下面的代码段展示了这个属性的设置:
<activity
android:name=".ResultActivity"
...
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true">
</activity>
...
下面的代码段演示了这个实现过程:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
Intent notifyIntent =
new Intent(new ComponentName(this, ResultActivity.class));
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent notifyIntent =
PendingIntent.getActivity(
this,
0,
notifyIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
builder.setContentIntent(notifyIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(id, builder.build());