如何知道我在通知栏的展示的 Notification 被点击了?

在某些业务需求下,我们需要统计发出去的通知被点击的次数,但是察看 Notifycation 和 NotifycationManager 里面都没有相关方法来设置点击监听器!

那怎么办?

Notifycation 本来就需要我们给他设置一个 Intent 来执行点击之后的动作,这个 Intent 通过 PendingIntent 赋予。

关于 PendingIntent 刚接触可能会觉得不理解,官方解释:A description of an Intent and target action to perform with it. 即将要执行的动作

我们先从区别上来看他们:

1.普通的 Intent 我们发出去之后立马就执行了,比如 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parser("http://baidu.com"))) 之后立马就跳到浏览器打开百度首页了

2.Notifycation 发出去之后用户什么时候点击是不确定的,我们先将点击之后要执行的 Intent 保存下来,等到用户点击之后在取出来执行,那用什么来保存 Intent 呢?PendingIntent(注:我这里为了方便理解而这样解释,事实上 PendingIntent 远比保存 Intent 复杂,涉及跨进程)

而,Intent 本身实现了 Parcelable 接口,可以用来跨进程传输,所以我们可以通过 Intent.putExtra(“name”, intemt) 将真正要执行的 Intent 保存在 clickIntent 对象里!

然后我们使用 clickIntent 来启动 BroadcastReceiver ,(因为 BroadcastReceiver 是一个轻量级的东西,用在这种情况下再适合不过了),看码:

[java] view plaincopyprint? Intent realIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(“http://wap.mrpej.com”)); //真正的 Intent
realIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Intent clickIntent = new Intent(this, ClickReceiver.class); //点击 Intent
clickIntent.putExtra(“realIntent”, realIntent);

Intent realIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://wap.mrpej.com")); //真正的 Intent
    realIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    Intent clickIntent = new Intent(this, ClickReceiver.class); //点击 Intent
    clickIntent.putExtra("realIntent", realIntent);

当用户点击 Notifycation 之后,系统调用 ClickReceiver 的 onReceiver() 方法,你在此时执行真正的点击逻辑就OK,看码:

[java] view [email protected]
public void onReceive(Context context, Intent intent) {

Toast.makeText(context, "通知被点击了", Toast.LENGTH_SHORT).show();  

Intent realIntent = intent.getParcelableExtra("realIntent");
context.startActivity(realIntent);

}

@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "通知被点击了", Toast.LENGTH_SHORT).show();

    Intent realIntent = intent.getParcelableExtra("realIntent");
    context.startActivity(realIntent);
}

但是 onReceiver 里面不能执行长时间的任务,类似网络全球这样的工作,那怎么办呢?照理,你在此时启动一个 Service 来处理就OK!

完整代码:

[java] view plaincopyprint?private void showNotifycation() {

Notification n = new Notification(android.R.drawable.stat_notify_chat, "hello I am yichou!", System.currentTimeMillis());  

Intent realIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://wap.mrpej.com"));
realIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  

Intent clickIntent = new Intent(this, ClickReceiver.class);
clickIntent.putExtra("realIntent", realIntent);  

PendingIntent pi = PendingIntent.getBroadcast(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);  

n.setLatestEventInfo(this,
        "叙利亚化学武器疑云",
        "叙利亚现总统巴沙尔-阿萨德,是叙已故总统老阿萨德的次子...",
        pi);
n.flags |= Notification.FLAG_AUTO_CANCEL; //点击一次后自动消除   

NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(1001, n);

}

private void showNotifycation() {
    Notification n = new Notification(android.R.drawable.stat_notify_chat, "hello I am yichou!", System.currentTimeMillis());

    Intent realIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://wap.mrpej.com"));
    realIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    Intent clickIntent = new Intent(this, ClickReceiver.class);
    clickIntent.putExtra("realIntent", realIntent);

    PendingIntent pi = PendingIntent.getBroadcast(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    n.setLatestEventInfo(this,
            "叙利亚化学武器疑云",
            "叙利亚现总统巴沙尔-阿萨德,是叙已故总统老阿萨德的次子...",
            pi);
    n.flags |= Notification.FLAG_AUTO_CANCEL; //点击一次后自动消除

    NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    nm.notify(1001, n);
}

注意点:

1.在 onReceiver 的 context 直接启动 Activity 是会报错的,需要给 Intent 加上 Intent.FLAG_ACTIVITY_NEW_TASK 标志!

时间: 2024-11-07 20:53:39

如何知道我在通知栏的展示的 Notification 被点击了?的相关文章

android 自定义带按钮的Notification及点击事件和伸缩通知栏

1.自定义一个带按钮的Notification布局:layout_notification: 2.创建Notification: RemoteViews views = new RemoteViews(getPackageName(),R.layout.layout_nitification); //自定义的布局视图 //按钮点击事件: PendingIntent homeIntent = PengdingIntent.getBroadcast(this,1,new Intent("action

Notification(Notification的通知栏常驻、各种样式、点击无效、禁止滑动删除、兼容低版本)

Notification(Notification的通知栏常驻.Notification的各种样式.Notification点击无效.Notification禁止滑动删除) Android的Notification是android系统中很重要的一个机制, 产品人员常常利用通知栏的方式,跟用户进行弱沟通.拥有推送通知的app要比没有此类功能的app活跃率要高很多.另外类似于墨迹天气,清理大师等app,也会将通知栏常驻,利用自定义的布局,方便用户及时快捷的查看所需的信息和使用快捷的功能.所以Noti

记录 vue自定义指令 实现展示搜索记录,点击其他区域隐藏

// const clickoutside = { //   bind(el, binding,) { //     function documentHandler(e) { //   // 这里判断点击的元素是否是本身,是本身,则返回 //       if (el.contains(e.target)) { //         return false; //   } //   // 判断指令中是否绑定了函数 //       if (binding.expression) { //  

Android中通知栏的使用

Hi,众猿们,今天讲讲安卓中通知的使用: 什么是通知:安卓系统用户发送消息的一种方式,当通知发出后,会出现在系统的通知栏上,当用户点击通知时,会进入到相应的界面(想象下当有新短信到来时的情况),一个默认的通知包含的内容为: ![通知包含的内容](http://img.blog.csdn.net/20160420212314894) 通知的基本使用方式:其代码如下(一般定义在上下文对象(如Activity)中): //获得通知管理器,通知是一项系统服务 NotificationManager ma

Android:通知栏的使用

非常久没有使用Android的通知功能了,今天把两年前的代码搬出来一看.发现非常多方法都废弃了,代码中各种删除线看的十分不爽.于是乎,打开Google,查看官方文档.学习最新的发送通知栏消息的方法. 本文中的代码均參照谷歌官方文档编写: http://developer.android.com/guide/topics/ui/notifiers/notifications.html 1.首先.获取系统的通知服务: NotificationManager nm = (NotificationMan

Android通知栏介绍与适配总结

由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知栏玩法,谷歌也不得不对其进行更新迭代调整,增加新功能的同时,也在不断地改变样式,试图迎合更多人的口味.本文总结了Android通知栏的版本迭代过程,在通知栏开发过程中所遇到的各种各样的坑,以及一些解决技巧,特别的,对于大众期盼的Android 7.0的到来,通知栏又会发生怎样的改变呢?接下来一一进行介绍. Android通知栏发展历史 首先来看一张各个Android版本通知栏消息的全家福

Android实现点击通知栏后,先启动应用再打开目标Activity

情况简述 在开发Android app的过程中,遇到这样一个需求:app中启动一个Service,该Service在独立进程中运行,与服务器保持长连接,将服务器推送过来的消息在通知栏中显示,并设置点击动作,点击后跳转到app中对应的Activity.目前遇到的问题是Service以独立进程运行,在收到消息并弹出通知后,app本身的进程有两种情况: app正在运行 app已退出 对于第一种情况,处理就非常简单了,直接将参数传入Intent并打开对应的Activity即可. 但第二种情况比较复杂,因

android的通知栏的实现

package com.example.mynotification; import android.os.Bundle; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.suppor

微信端网页中图片的展示方式

一.微信端网页中图片的展示方式 微信端网页中图片有两种展示方式:平铺与图集.平铺的时候文档内的所有图片全部展开,点击图片则放大.图集的时候只展示一张图片,点击图片的时候以翻页的方式展示一组图片.实现原理对于如下一个图片标签,data-gid用于存放组标识,同一组的data-gid相同.data-index用于存放组中图片的展示顺序,不能相同.onclick中根据data-src处理图片展示.对于图集就只显示一张其他的img设置为隐藏,src与第一个图片一样,或者为空,这样可以减少网页的加载量,提