通过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); 
 
 
  • 1
  • 2

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

  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);
                    }

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

我们在创建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>  
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

相对于第一种情况,第二种情况稍微复杂点,因为如果只打开目标页面,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;
    }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其中需要注意的是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);
                    }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

转自:http://blog.csdn.net/caohuicong/article/details/61196361  (若侵犯到博主权益,联系本人,定会删除)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值