Notification&PendingIntent 发现问题+解决+思考

项目上遇到一个通知栏消息打开的bug,解决的过程很有意思,所以写下来纪念下。


问题是这样的,我们使用的信鸽推送,当用户购买下单后,会发送一条消息,通知栏点击消息,根据消息中的交易流水号打开对应的订单详情页面。问题来了,当我们连续购买2单(多单),通知栏有2条(多条)消息时,只有第一次点击的消息可以正确的跳转到对应的页面,第二条消息点击是没有反应的。

Intent intent = new Intent(context, OrderDetailActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(OrderDetailActivity.ORDER_IS_AFTER_ONE_MONTH, false);
intent.putExtra(OrderDetailActivity.ORDER_SERIAL_NUM, new JSONObject(mr.sExt).getString("serial"));
intent.putExtra(OrderDetailActivity.ORDER_BIZ, new JSONObject(mr.sExt).getString("biz"));
pi = PendingIntent.getActivity(context, nId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
n.defaults |= Notification.DEFAULT_SOUND;
n.defaults |= Notification.DEFAULT_VIBRATE;
n.flags |= Notification.FLAG_AUTO_CANCEL;
n.setLatestEventInfo(context, msgTitle, msgContent, pi);
// 发送通知
nm.notify(nId++, n);

这是原来的代码,简单的review并查找资料后会发现有两个地方值得重点关注:

1.addFlags方法,决定了页面的启动方式,这一点和之后页面的刷新戚戚相关,乍一看貌似没有啥问题;

2.FLAG_UPDATE_CURRENT,这个flag值字面的意思就是更新intent中的参数值,好像也没太大的问题;


从此陷入迷茫。。。直到看到下面这个前辈的博客http://www.cnblogs.com/anrainie/articles/2383941.html,PendingIntent有一个特点,如果新的PendingIntent所做的操作已经存在(如页面已经被打开),则第二个PendingIntent不会做任何操作,而这个FLAG_UPDATE_CURRENT的作用就是,存在多个相同意图PendingIntent时用后来的覆盖之前的。这样问题就好理解了,我们只需要区分两个PendingIntent的跳转,使每一次跳转造成的效果都不一样就可以了,博客中给出了两种解决办法:

1、在Activity的onPause()方法体中增加:finish();这样,在打开新的Activity的时候,旧的就进入了暂停态,启动onPause(),然后执行finish(),关闭页面,下次重新打开新页面;

2、设置Intent:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP),这样每次打开的动作,其实都是打开一个新的页面,我们只需要在打开的Activity的onNewIntent回调中,处理下传进来的参数,就可以实现页面的刷新了。


显然应该第二种方法更便捷~~~修改之后我继续试了一下,发现依旧存在问题:在应用已启动的情况下,我们依次打开两条消息,页面打开显示的数据没有问题,但是,在应用未启动的情况下,依次打开两条消息,依旧无法刷新。这又是什么鬼!


其实答案还是在刚刚的博客中,只是没有那么明显,需要稍微思考一下:我们为Intent添加:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);之后,这个意图一旦产生,就会自动清除栈顶的活动,就是说,上一个被打开的活动会被终结掉,于是就实现了没有两个相同的活动被同时打开。


通过通知栏的点击的方式进行的跳转,是直接打开的某一个页面,如果我们没有为这个Activity单独设置launchMode,这个页面不知道去哪个栈了,也许是系统的主栈?总之CLEAR_TOP这个flag是根本无法起作用,所以bug依旧!而在应用已启动的情况下,通知栏打开的页面,是属于该应用的栈内的,所以CLEAR_TOP是可以起作用的!


SO,加上下面这条设置,就大功告成了!

        <activity
            android:name="com.tencent.djcity.activities.OrderDetailActivity"
            android:exported="false"
            android:launchMode="singleTop"
            android:screenOrientation="portrait" />


第一篇博客大功告成哈哈哈~~~




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值