上一篇讲了如何建立并显示一个notification,这一篇就总结下点击notification后,程序应该如何响应。java
通常来说,点击一个notification后,都会打开一个Activity作为对点击事件的响应,这个Activity是以前在PendingIntent中设置好的。android
常常玩Android手机的应该都有印象,在日历应用中,你新建一个提醒,当提醒通知收到后,你点击通知,会进入提醒的内容页面,若是这个时候按back键,会直接退出应用。数组
可是在Gmail的应用中,若是有一封新邮件到来,那么点击通知后,会进入到邮件的内容页面,等你看完邮件,点击back键,会退到邮件列表页面,再按back键,才会退出应用。函数
咱们总结一下两种状况,假设咱们的应用有两个Activity(ParentActivity、SubActivity),notification中设置打开的Activity为SubActivity。this
那么第一种状况就是:spa
点击Notification ——>进入SubActivity ——> back键 ——> 退出应用code
第二种状况:orm
点击Notification ——>进入SubActivity ——> back键 ——> 退到ParentActivity ——>back键 ——>退出应用事件
第一种状况比较简单,只须要在PendingIntent中指定Activity,不须要其余设置,Android默认的就这样。get
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
可是在建立PendingIntent的时候须要注意参数PendingIntent.FLAG_CANCEL_CURRENT
这个标志位用来指示:若是当前的Activity和PendingIntent中设置的intent同样,那么久先取消当前的Activity,用PendingIntent中指定的Activity取代之。
另外,须要在Manifest中对指定的Activity设置属性
<activity android:name=".SubActivityl" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
第二种状况稍微复杂点,由于若是只打开一个SubActivity,程序并没办法知道他的上一级Activity是谁,因此须要在点击Notification时打开一组Activity,可是咱们并不须要一个个去调用startActivity方法,PendingIntent提供了个静态方法getActivities,里面能够设置一个Intent数组,用来指定一系列的Activity。
因此咱们首先写一个函数建立一个Activity数组:
Intent[] makeIntentStack(Context context) { Intent[] intents = new Intent[2]; intents[0] = Intent.makeRestartActivityTask(new ComponentName(context, com.example.notificationtest.MainActivity.class)); intents[1] = new Intent(context, com.example.notificationtest.SubActivity.class); return intents; }
其中须要注意的是Intent.makeRestartActivityTask方法,这个方法用来建立activity栈的根activity
接下来,建立并显示Notification:
void showNotification(Intent intent) { Notification notification = new Notification( R.drawable.status_icon, "Hello World ticker text", System.currentTimeMillis()); PendingIntent contentIntent = PendingIntent.getActivities( this, 0, makeIntentStack(this), PendingIntent.FLAG_CANCEL_CURRENT); notification.setLatestEventInfo( this, "Title", "Hey, shall we have a dinner tonight", contentIntent); notification.flags |= Notification.DEFAULT_ALL; mNM.notify(1, notification); }