原文地址:http://www.codeceo.com/article/android-notification-4-types.html


Android Notification在每一个Android应用开发中基本都会遇到,它可以按指定的规则向用户推送一些消息,是一项非常实用的功能。本文主要介绍了Android Notification 用法的4种形式,希望可以对各位Android开发者有所帮助。

实现通知一般有以下几个步骤:

  • 1.获取通知服务对象NotificationManager
  • 2.建立Notification对象
  • 3.关联intent
  • 4.执行通知

Notification一般有几种用途:,如下图

Android Notification 用法的4种形式_第1张图片

1.启动多次通知但只显示一条

如果有很多通知的内容一样,为了不影响系统通知显示的列表过多,可以进行计数堆积,只显示一条,代码如下:

btn1.setOnClickListener(new View.OnClickListener() {                  @Override              public void onClick(View v) {                  count++;                  //从系统服务中获得通知管理器                  NotificationManager nm=(NotificationManager)MainActivity.this.getSystemService(Context.NOTIFICATION_SERVICE);                  //定义notification                  Notification n=new Notification(R.drawable.ic_launcher,"我是通知提示",System.currentTimeMillis());                  n.flags=Notification.FLAG_AUTO_CANCEL;                  n.number=count;                  //通知消息与Intent关联                  Intent it=new Intent(MainActivity.this,Second.class);                  it.putExtra("name", "name:"+count);                  PendingIntent pi=PendingIntent.getActivity(MainActivity.this, 100, it, PendingIntent.FLAG_CANCEL_CURRENT);                  //具体的通知内容                  n.setLatestEventInfo(MainActivity.this, "标题", "启动多次通知只显示一条",pi);                  //执行通知                  nm.notify(1, n);              }          });

点击4次后,效果如下:

Android Notification 用法的4种形式_第2张图片

这是由于nm.notify(1,n)的requestCode全相同导致的。

2.启动多次通知,并且显示多条,但只能用最新的一条跳转至活动

btn2.setOnClickListener(new View.OnClickListener() {                  @Override              public void onClick(View v) {                  count++;                  //从系统服务中获得通知管理器                  NotificationManager nm=(NotificationManager)MainActivity.this.getSystemService(Context.NOTIFICATION_SERVICE);                  //定义notification                  Notification n=new Notification(R.drawable.ic_launcher,"我是通知提示",System.currentTimeMillis());                  n.flags=Notification.FLAG_AUTO_CANCEL;                  n.number=count;                  //通知消息与Intent关联                  Intent it=new Intent(MainActivity.this,Second.class);                  it.putExtra("name", "name:"+count);                  PendingIntent pi=PendingIntent.getActivity(MainActivity.this, 100, it, PendingIntent.FLAG_CANCEL_CURRENT);                  //具体的通知内容                  n.setLatestEventInfo(MainActivity.this, "标题", "启动多次通知显示多条,但只能用最新的通知跳转到活动",pi);                  //执行通知                  nm.notify(count, n);              }          });

结果如下:

Android Notification 用法的4种形式_第3张图片

点击第5,6条通知均不会跳转,只有点击第7条才可跳转。

而这是由于PendingIntent的RequestCode相同而导致的。

3.启动多次通知,并且显示多条,每一条通知都能跳转至对应的活动

btn3.setOnClickListener(new View.OnClickListener() {                  @Override              public void onClick(View v) {                  count++;                  //从系统服务中获得通知管理器                  NotificationManager nm=(NotificationManager)MainActivity.this.getSystemService(Context.NOTIFICATION_SERVICE);                  //定义notification                  Notification n=new Notification(R.drawable.ic_launcher,"我是通知提示",System.currentTimeMillis());                  n.flags=Notification.FLAG_AUTO_CANCEL;                  n.number=count;                  //通知消息与Intent关联                  Intent it=new Intent(MainActivity.this,Second.class);                  it.putExtra("name", "name:"+count);                               PendingIntent pi=PendingIntent.getActivity(MainActivity.this, count, it, PendingIntent.FLAG_CANCEL_CURRENT);                  //具体的通知内容                  n.setLatestEventInfo(MainActivity.this, "标题", "启动多次通知显示多条,每一条通知都能跳转到对应的活动",pi);                  //执行通知                  nm.notify(count, n);              }          });

由于nm.notify(count,n)的code每次都不一样,相当于为每一个通知关联了一个属于自己的intent,结果和上图一致,只是每一个通知都可跳转至对应活动。

4,自定义布局

下图中的第一条通知就是自定义的:

Android Notification 用法的4种形式_第4张图片

自定义布局方式的通知和普通的方式唯一的区别就是加载了一个RemoteView,片段如下:

RemoteViews rv=new RemoteViews(MainActivity.this.getPackageName(),R.layout.notify);                  n.contentView=rv;                  //通知消息与Intent关联                  Intent it=new Intent(MainActivity.this,Second.class);                  it.putExtra("name", "name:"+count);                               PendingIntent pi=PendingIntent.getActivity(MainActivity.this, count, it, 0);                  n.contentIntent=pi;

这个自定义通知我本来想实现定义一个按钮,点击按钮后取消通知。我的思路如下:

由于RemoteView并没没有类似findViewById的方法,所以我没办法找到新加载的布局文件上的控件,更没办法为其添加按钮事件。

但是在关联intent的时候,PendingIntent提供了较多的方法,其中主要有:

Android Notification 用法的4种形式_第5张图片

可以看到,可以关联三大组件。

再者,RemoteView虽然没有findViewById,但是他有setOnClickFillInIntent和setOnClickPendingIntent两个方法

我先建立了一个广播

//注册广播          BroadcastReceiver b=new BroadcastReceiver(){              @Override              public void onReceive(Context context, Intent intent) {                  Toast.makeText(context, "button被点击了", 3000).show();              }          };          IntentFilter filter=new IntentFilter();          filter.addAction("ONCLICK");          this.registerReceiver(b, filter);

然后在nm.notify后继续设置控件的事件

//执行通知                  nm.notify(count, n);                  //设置控件                  rv.setTextViewText(R.id.tv2, "我是自定义布局");                  Intent clickIntent=new Intent("ONCLICK");                  PendingIntent clickPending=PendingIntent.getBroadcast(MainActivity.this, count, clickIntent, 0);                  rv.setOnClickPendingIntent(R.id.cancel, clickPending);

结果并没有执行,广播根本没接收到,我感觉代码是没有问题的,查看了下setOnClickPendingIntent,竟然说对LisetView等控件的事件不起作用,又查看了setOnClickFillInIntent,这个貌似有用,系统还推荐了另外一个与之类似的方法,由于level级别不够,不能使用,我也就没有验证,应该是可以的,不然那么多应用好看的通知都是咋做的啊,先记下来,以后有需求的时候好好研究下。

参考代码:http://download.csdn.net/detail/kkkkkxiaofei/6723903


更多相关文章

  1. android Gallery控件与BaseAdapter适配器
  2. Android 控件之ImageSwitcher图片切换器
  3. Android常用控件的使用方法
  4. Android 控件在布局中按比例放置
  5. 后台动态添加布局文件、控件与动态设置属性2
  6. 实现 Android 通知提示功能
  7. 一个关于android中ListView的子控件中按钮事件的简单方法
  8. 使用Android常用控件与布局实现美观的登录页面
  9. Android Studio 初步在代码中操作控件

随机推荐

  1. 标题test123
  2. Vscode的下载安装和必备插件的使用与Mark
  3. 程序员找不到女朋友?利用 Python 爬虫帮你
  4. 中秋是你超越别人最好的机会,附Java 学习
  5. 数据库悲观锁 for update 的使用场景之一
  6. 你真的懂 select count(*) 吗?
  7. Centos7环境部署及基本操作
  8. 任务介绍及比赛结果 在刚刚结束的CoNLL-2
  9. “双亲委派”一词的由来
  10. 尚硅谷大数据视频_Hive视频教程免费下载