android-Notification点击跳转指定的Activity

今天项目中有这样的一个需求,当程序还没被进程“杀死”的时候,后台推送来了一则消息,这时候不管是程序在前台运行,还是后台中,需要我们以通知栏的方式来通知用户。
对于通知栏,用户操作后有两种情况。
1.当程序在前台运行的时候,点击后,直接跳到目标Activity,此时,点击返回键是回到上个页面
2.点击通知栏后,先启动App,然后再跳到目标页面,此时,按下返回键是回到App的首页,而不至于退出App

第一种情况实现:
这种情况比较容易,只要直接在PendingIntent 中指定Activity中即可

Intent intent = new Intent(getApplicationContext(), SplashActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,  intent, PendingIntent.FLAG_CANCEL_CURRENT); 

因此第一种情况,结合创建一个通知栏的代码结合就是:

  NotificationManager barmanager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notice;
        Notification.Builder builder = new Notification.Builder(contxt).setTicker(message)
                .setSmallIcon(R.drawable.ic_launcher).setWhen(System.currentTimeMillis());
                 Intent appIntent=null;
                    appIntent = new Intent(context,ActivitySplash.class);
                    appIntent.setAction(Intent.ACTION_MAIN);
                    appIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                    appIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);//关键的一步,设置启动模式
                    PendingIntent contentIntent =PendingIntent.getActivity(context, 0,appIntent,PendingIntent.FLAG_UPDATE_CURRENT);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        notice = builder.setContentIntent(contentIntent).setContentTitle(title).setContentText(content).build();
                        notice.flags=Notification.FLAG_AUTO_CANCEL;
                        barmanager.notify(10,notice);
                    }

我们在创建PendingIntent的时候需要注意参数PendingIntent.FLAG_CANCEL_CURRENT
这个标志位用来指示:如果当前的Activity和PendingIntent中设置的intent一样,那么就要先取消当前的Activity,用PendingIntent中指定的Activity取代之。
另外,需要在Manifest中对指定的Activity设置属性

<activity android:name=".SplashActivity.class"  
        android:launchMode="singleTask"  
        android:taskAffinity=""  
        android:excludeFromRecents="true">  
activity>  

相对于第一种情况,第二种情况稍微复杂点,因为如果只打开目标页面,DetaitActivity,程序并没办法知道他的上一级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.root.activity.MainActivity.class));
        intents[1] = new Intent(context,  com.example.activity.ActiveDetailActivity.class);
        return intents;
    }

其中需要注意的是Intent.makeRestartActivityTask方法,这个方法用来创建activity栈的根activity
接下来,我们需要创建并显示通知栏:

 NotificationManager barmanager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notice;
        Notification.Builder builder = new Notification.Builder(contxt).setTicker(message)
                .setSmallIcon(R.drawable.ic_launcher).setWhen(System.currentTimeMillis());
  Intent[] appIntent=null;
                    appIntent=makeIntentStack(context);//上面有改方法
                    appIntent[1].setAction(Intent.ACTION_MAIN);
                    appIntent[1].addCategory(Intent.CATEGORY_LAUNCHER);
                    appIntent[1].setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);//关键的一步,设置启动模式
                    PendingIntent contentIntent =PendingIntent.getActivities(context, 0,appIntent,PendingIntent.FLAG_UPDATE_CURRENT);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        notice = builder.setContentIntent(contentIntent).setContentTitle(title).setContentText(content).build();
                        notice.flags=Notification.FLAG_AUTO_CANCEL;
                        barmanager.notify(10,notice);
                    }

然后功能基本是这样实现了,很感谢这篇博客的启发:

http://blog.csdn.net/shareus/article/details/50364705

你可能感兴趣的:(V鸟)