最近一直在研究 android ,并一边研究一边做应用。其中遇到了把程序通知常驻在 Notification 栏,并且不能被 clear 掉(就像android QQ一样)的问题。经过研究实现了其功能,现把 Notification 的使用总结如下:

Notification 的使用需要导入 3 个类

import android.app.PendingIntent;import android.app.NotificationManager;import android.app.Notification;

代码示例及说明

NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);Notification n = new Notification(R.drawable.chat, "Hello,there!", System.currentTimeMillis());n.flags = Notification.FLAG_AUTO_CANCEL;Intent i = new Intent(arg0.getContext(), NotificationShow.class);i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);//PendingIntentPendingIntent contentIntent = PendingIntent.getActivity(arg0.getContext(), R.string.app_name, i, PendingIntent.FLAG_UPDATE_CURRENT);n.setLatestEventInfo(arg0.getContext(),"Hello,there!", "Hello,there,I'm john.", contentIntent);nm.notify(R.string.app_name, n);

下面依次对每一段代码进行分析:

NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

创建 NotificationManager,其中创建的 nm 对象负责“发出”与“取消” Notification。

Notification n = new Notification(R.drawable.chat, "Hello,there!", System.currentTimeMillis());n.flags = Notification.FLAG_ONGOING_EVENT;

创建 Notification ,参数依次为:icon的资源id,在状态栏上展示的滚动信息,时间。其中创建的 n 对象用来描述出现在系统通知栏的信息,之后我们将会看到会在 n 对象上设置点击此条通知发出的Intent。

n.flags = Notification.FLAG_AUTO_CANCEL;

设置 n.flags 为 Notification.FLAG_AUTO_CANCEL ,该标志表示当用户点击 Clear 之后,能够清除该通知。

Intent i = new Intent(arg0.getContext(), NotificationShow.class);i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);

创建一个Intent,该Intent使得当用户点击该通知后发出这个Intent

请注意,如果要以该Intent启动一个Activity,一定要设置 Intent.FLAG_ACTIVITY_NEW_TASK 标记。

Intent.FLAG_ACTIVITY_CLEAR_TOP :如果在当前Task中,有要启动的Activity,那么把该Acitivity之前的所有Activity都关掉,并把此Activity置前以避免创建Activity的实例

Intent.FLAG_ACTIVITY_NEW_TASK :系统会检查当前所有已创建的Task中是否有该要启动的Activity的Task,若有,则在该Task上创建Activity,若没有则新建具有该Activity属性的Task,并在该新建的Task上创建Activity。更多请参见 “ (转载)Android下Affinities和Task ”

//PendingIntentPendingIntent contentIntent = PendingIntent.getActivity(arg0.getContext(), R.string.app_name, i, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent 为Intent的包装,这里是启动Intent的描述,PendingIntent.getActivity 返回的PendingIntent表示,此PendingIntent实例中的Intent是用于启动 Activity 的Intent。PendingIntent.getActivity的参数依次为:Context,发送者的请求码(可以填0),用于系统发送的Intent,标志位。

其中 PendingIntent.FLAG_UPDATE_CURRENT 表示如果该描述的PendingIntent已存在,则改变已存在的PendingIntent的Extra数据为新的PendingIntent的Extra数据。

这里再简要说一下 Intent 与 PendingIntent 的区别:

Intent :意图,即告诉系统我要干什么,然后系统根据这个Intent做对应的事。如startActivity相当于发送消息,而Intent是消息的内容。

PendingIntent :包装Intent,Intent 是我们直接使用 startActivity , startService 或 sendBroadcast 启动某项工作的意图。而某些时候,我们并不能直接调用startActivity , startServide 或 sendBroadcast ,而是当程序或系统达到某一条件才发送Intent。如这里的Notification,当用户点击Notification之后,由系统发出一条Activity 的 Intent 。因此如果我们不用某种方法来告诉系统的话,系统是不知道是使用 startActivity ,startService 还是 sendBroadcast 来启动Intent 的(当然还有其他的“描述”),因此这里便需要PendingIntent。

n.setLatestEventInfo(arg0.getContext(),"Hello,there!", "Hello,there,I'm john.", contentIntent);

设置显示在通知下拉框中的信息,参数依次为:Context,标题,内容,PendingIntent。

nm.notify(R.string.app_name, n);

启动Notification,参数依次为:在你的程序中标识Notification的id值(用来区分同一程序中的不同Notifycation,如果程序中只有一个Notification那么这里随便你填什么都可以,不过类型必须要为int),要通知的Notification。

如何使自己的Notification像Android QQ一样能出现在 “正在运行的”栏目下面

其实很简单,只需设置Notification.flags = Notification.FLAG_ONGOING_EVENT;便可以了。

如何改变 Notification 在“正在运行的”栏目下面的布局

创建 RemoteViews 并赋给 Notification.contentView ,再把 PendingIntent 赋给 Notification.contentIntent 便可以了,如:

PendingIntent contentIntent = PendingIntent.getActivity(arg0.getContext(), R.string.app_name,i, PendingIntent.FLAG_UPDATE_CURRENT);RemoteViews rv = new RemoteViews(Main.this.getPackageName(), R.layout.notification_view);rv.setImageViewResource(R.id.image, R.drawable.chat);rv.setTextViewText(R.id.text, "Hello,there,I'm john.");n.contentView = rv;n.contentIntent = contentIntent;nm.notify(R.string.app_name, n);

注意,如果使用了contentView,那么便不要使用Notification.setLatestEventInfo。如果setLatestEventInfo在赋给 Notification.contentView 的代码之后,那么contentView的效果将被覆盖,显示的便是 setLatestEventInfo 的效果;如果 setLatestEventInfo 在 Notification.contentView 的代码之前,那么显示的便是 Notification.contentView 的效果,也就是说不管你想要setLatestEventInfo 或 contentView 的自定义效果,请保证始终只有一句设置代码,因为在最后一句绑定的时候,之前的设置contentView或setLatestEventInfo的代码都是完全没有必要的。

Technorati 标签: Android, Notification

作者:newcj
出处:http://newcj.cnblogs.com/
欢迎转载,但还请尊重劳动果实,保留此段声明并注明原文链接。

标签: Android, Notification

更多相关文章

  1. Android启动过程图解
  2. Intent详解 (一) : 显式Intent
  3. Android初级教程获取手机系统联系人信息
  4. Android——Framework目录分析及系统启动过程以及目录简介
  5. android一键退出
  6. android 通知播放系统声音
  7. 关于Android(安卓)Studio开发环境变量的设置(avd启动黑屏)
  8. Android中应用的快捷方式的创建
  9. Android中Context的理解与使用技巧

随机推荐

  1. mysql并发控制原理知识点
  2. mysql创建表的sql语句详细总结
  3. Windows 64位重装MySQL的教程(Zip版、解压
  4. mysql 悲观锁与乐观锁的理解及应用分析
  5. mysql 复制原理与实践应用详解
  6. mysql 数据库备份的多种实现方式总结
  7. mysql 的root 用户无法授权及解决navicat
  8. mysql的事务,隔离级别和锁用法实例分析
  9. mysql5.7 生成列 generated column用法实
  10. mysql8 公用表表达式CTE的使用方法实例分