zoukankan      html  css  js  c++  java
  • android Notification 的使用

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

    Notification 的使用需要导入 3 个类

    1 import android.app.PendingIntent;
    2 import android.app.NotificationManager;
    3 import android.app.Notification;
    代码示例及说明
     
     1 NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);               
     2 Notification n = new Notification(R.drawable.chat, "Hello,there!", System.currentTimeMillis());             
     3 n.flags = Notification.FLAG_AUTO_CANCEL;                
     4 Intent i = new Intent(arg0.getContext(), NotificationShow.class);
     5 i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);           
     6 //PendingIntent
     7 PendingIntent contentIntent = PendingIntent.getActivity(
     8         arg0.getContext(), 
     9         R.string.app_name, 
    10         i, 
    11         PendingIntent.FLAG_UPDATE_CURRENT);
    12                  
    13 n.setLatestEventInfo(
    14         arg0.getContext(),
    15         "Hello,there!", 
    16         "Hello,there,I'm john.", 
    17         contentIntent);
    18 nm.notify(R.string.app_name, n);

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

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

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

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

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

    1 n.flags = Notification.FLAG_AUTO_CANCEL;

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

    1 Intent i = new Intent(arg0.getContext(), NotificationShow.class);
    2 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 ”

    1 //PendingIntent
    2 PendingIntent contentIntent = PendingIntent.getActivity(
    3         arg0.getContext(), 
    4         R.string.app_name, 
    5         i, 
    6         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。

    1 n.setLatestEventInfo(
    2         arg0.getContext(),
    3         "Hello,there!", 
    4         "Hello,there,I'm john.", 
    5         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 便可以了,如:

     1 PendingIntent contentIntent = PendingIntent.getActivity(
     2     arg0.getContext(), 
     3     R.string.app_name,
     4     i, 
     5     PendingIntent.FLAG_UPDATE_CURRENT);
     6              
     7 RemoteViews rv = new RemoteViews(Main.this.getPackageName(), R.layout.notification_view);
     8 rv.setImageViewResource(R.id.image, R.drawable.chat);
     9 rv.setTextViewText(R.id.text, "Hello,there,I'm john.");
    10 n.contentView = rv;
    11 n.contentIntent = contentIntent;
    12  
    13 nm.notify(R.string.app_name, n);

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

    转载地址:http://www.cnblogs.com/newcj/archive/2011/03/14/1983782.html

  • 相关阅读:
    ruby 二进制转十进制 Integer("0b101") = 5
    开始菜单和我的文档的我的图片及我的音乐变成 my pictrues 正常图标了
    ruby watir 莫名其妙的错误
    Excel SaveAS是去掉提示框
    apache && jboss安装
    ruby require include的区别
    ruby控制鼠标
    This error is raised because the column 'type' is reserved for storing the class in case of inheritance
    用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字等各类代码
    ASP.NET 如何动态修改 Header 属性如添加 Meta 标签 keywords description!
  • 原文地址:https://www.cnblogs.com/androidxiaoyang/p/2937106.html
Copyright © 2011-2022 走看看