启动Activity时保留导航
编写:fastcome1985 - 原文:http://developer.android.com/training/notify-user/navigation.html
部分设计一个notification的目的是为了保持用户的导航体验。为了详细讨论这个课题,请看 Notifications API引导,分为下列两种主要情况:
* 常规的activity你启动的是你application工作流中的一部分[Activity]($ux-notify-user-developer.android.com-reference-android-app-Activity.html)。* 特定的activity用户只能从notification中启动,才能看到这个[Activity](http://developer.android.com/intl/zh-cn/reference/android/app/Activity.html),在某种意义上,这个[Activity](http://developer.android.com/intl/zh-cn/reference/android/app/Activity.html)是notification的扩展,额外展示了一些notification本身难以展示的信息。
设置一个常规的Activity PendingIntent
设置一个直接启动的入口Activity的PendingIntent,遵循以下步骤:
1 在manifest中定义你application的Activity层次,最终的manifest文件应该像这个:
<activityandroid: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><activityandroid:name=".ResultActivity"android:parentActivityName=".MainActivity"><meta-dataandroid:name="android.support.PARENT_ACTIVITY"android:value=".MainActivity"/></activity>
2 在基于启动Activity的Intent中创建一个返回栈,比如:
int id = 1;...Intent resultIntent = new Intent(this, ResultActivity.class);TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);// Adds the back stackstackBuilder.addParentStack(ResultActivity.class);// Adds the Intent to the top of the stackstackBuilder.addNextIntent(resultIntent);// Gets a PendingIntent containing the entire back stackPendingIntent 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 PendingIntent
一个特定的Activity不需要一个返回栈,所以你不需要在manifest中定义Activity的层次,以及你不需要调用 addParentStack())方法去构建一个返回栈。作为代替,你需要用manifest设置Activity任务选项,以及调用 getActivity())创建PendingIntent
manifest中,在Activity的
标签中增加下列属性: android:name=”activityclass” activity的完整的类名。 android:taskAffinity=”” 结合你在代码里设置的FLAG_ACTIVITY_NEW_TASK标识, 确保这个Activity不会进入application的默认任务。任何与 application的默认任务有密切关系的任务都不会受到影响。 android:excludeFromRecents=”true” 将新任务从最近列表中排除,目的是为了防止用户不小心返回到它。 建立以及发布notification: a.创建一个启动Activity的Intent. b.通过调用setFlags())方法并设置标识FLAG_ACTIVITY_NEW_TASK 与 FLAG_ACTIVITY_CLEAR_TASK,来设置Activity在一个新的,空的任务中启动。 c.在Intent中设置其他你需要的选项。 d.通过调用 getActivity()方法从Intent中创建一个 PendingIntent,你可以把这个PendingIntent 当做 setContentIntent()的参数来使用。 下面的代码片段演示了这个过程:
// Instantiate a Builder object.NotificationCompat.Builder builder = new NotificationCompat.Builder(this);// Creates an Intent for the ActivityIntent notifyIntent =new Intent(new ComponentName(this, ResultActivity.class));// Sets the Activity to start in a new, empty tasknotifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);// Creates the PendingIntentPendingIntent notifyIntent =PendingIntent.getActivity(this,0,notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT);// Puts the PendingIntent into the notification builderbuilder.setContentIntent(notifyIntent);// Notifications are issued by sending them to the// NotificationManager system service.NotificationManager mNotificationManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);// Builds an anonymous Notification object from the builder, and// passes it to the NotificationManagermNotificationManager.notify(id, builder.build());
