Android中通知的使用-----Notification详解

Notification —— 通知,是一种让你的应用程序在不使用Activity的情况下警示用户。它是看不见的程序组件(Broadcast Receiver,Service和不活跃的Activity)警示用户有需要注意的事件发生的最好途径。 Notification 是由NotificationManager(系统服务)统一管理的。

 

         一般来说, 一个Notification应该传送的消息包括:

                 1 、一个状态条图标       

                 2、在拉伸的状态栏窗口中显示额外的信息和启动一个Application的Intent

                 3、闪灯或LED

                 4、电话震动

 

         在状态栏(Status Bar)中,通知主要有两类(使用FLAG_标记,后面讲解到):

 

                 1、正在运行的事件

                 2、通知事件

 

     Notification图解如下:

 

                                                          

             

Notification类介绍:

        常量

              //表示发送一个Notification的所携带的效果

             DEFAULT_ALL              使用默认字段

             DEFAULT_LIGHTS       默认闪光

             DEFAULT_SOUND     默认声音(uri,指向路径)

             DEFAULT_VIRATE       默认震动,后来得知需要添加震动权限VIBRATE: android.permission.VIBRATE

 

 

          PS:以上的效果常量可以累加,即通过mNotifaction.defaults |=DEFAULT_SOUND   (有些效果只能在真机上才有,比如震动)

            //设置Flag位

            FLAG_AUTO_CANCEL           该通知能被状态栏的清除按钮给清除掉

          FLAG_NO_CLEAR                  该通知不能被状态栏的清除按钮给清除掉

            FLAG_ONGOING_EVENT      通知放置在正在运行

 

    常用字段 

           contentView                 通知在状态栏的显示View(自定义,具体请看下文) ,常与contentIntent配合使用,点击该通知后,

                                          即触发contentIntent

           contentIntent                 设置PendingIntent对象,点击该通知时发送该Intent

           flags                                  设置flag位,例如FLAG_NO_CLEAR等

           defaults                             添加效果

           tickerText                        显示在状态栏中的文字

          when                               发送此通知的时间戳

          icon                                  设置图标

 

   常用方法介绍

       void setLatestEventInfo(Context context , CharSequence contentTitle,CharSequence  contentText,PendingIntent contentIntent) 

          

        功能: 显示在拉伸状态栏中的Notification属性,点击后将发送PendingIntent对象。

        参数: context             上下文环境

                      contentTitle      状态栏中的大标题

                      contentText     状态栏中的小标题

                      contentIntent   点击后将发送PendingIntent对象

 

        另外的就是Notification的几步不同构造方法了,其构造方法的参数含义如上,请参考SDK 。

 

    注意,关于通知(Notification)的显示类型有两种:

 

                第一种使用默认的形式(效果图如上显示)。具体使用是为Notification对象设置setLatestEventInfo()方法(该方法内部创建

                           了默认的RemoteViews对象,因此为默认显示),否则程序会报异常 ;

 

                     第二种  使用自定义的View(RemoteViews对象)显示(功能更加自由,强大),具体方法为设置Notification对象的

                         contentView 属性和contentIntent属性 ,此时不需要设置setLatestEventInfo()方法。具体使用方法如下

  1. Notification noti = new Notification(icon, title, when + 10000); 
  2. noti.flags = Notification.FLAG_INSISTENT; 
  3. // 1、创建一个自定义的消息布局 notification.xml  
  4. // 2、在程序代码中使用RemoteViews的方法来定义image和text。然后把RemoteViews对象传到contentView字段  
  5. RemoteViews remoteView = new RemoteViews(this.getPackageName(),R.layout.notification); 
  6. remoteView.setImageViewResource(R.id.image, R.drawable.icon); 
  7. remoteView.setTextViewText(R.id.text , "Hello,this message is in a custom expanded view"); 
  8. noti.contentView = remoteView; 
  9. // 3、为Notification的contentIntent字段定义一个Intent(注意,使用自定义View不需要setLatestEventInfo()方法)  
  10.       
  11. //这儿点击后简答启动Settings模块  
  12. PendingIntent contentIntent = PendingIntent.getActivity 
  13.                  (MainActivity.this, 0,new Intent("android.settings.SETTINGS"), 0); 
  14. noti.contentIntent = contentIntent; 
		Notification noti = new Notification(icon, title, when + 10000);
		noti.flags = Notification.FLAG_INSISTENT;
		// 1、创建一个自定义的消息布局 notification.xml
		// 2、在程序代码中使用RemoteViews的方法来定义image和text。然后把RemoteViews对象传到contentView字段
		RemoteViews remoteView = new RemoteViews(this.getPackageName(),R.layout.notification);
		remoteView.setImageViewResource(R.id.image, R.drawable.icon);
		remoteView.setTextViewText(R.id.text , "Hello,this message is in a custom expanded view");
		noti.contentView = remoteView;
		// 3、为Notification的contentIntent字段定义一个Intent(注意,使用自定义View不需要setLatestEventInfo()方法)
       
		//这儿点击后简答启动Settings模块
		PendingIntent contentIntent = PendingIntent.getActivity
		                 (MainActivity.this, 0,new Intent("android.settings.SETTINGS"), 0);
		noti.contentIntent = contentIntent;

 

 

  本文采用的RemoteViews资源文件如下:/layout/notification.xml

             

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  4.     android:orientation="horizontal" android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent"
  6.  
  7.     <ImageView android:id="@+id/image" android:layout_width="wrap_content" 
  8.         android:layout_height="fill_parent" /> 
  9.  
  10.     <TextView android:id="@+id/text" android:layout_width="wrap_content" 
  11.         android:layout_toRightOf="@+id/image" 
  12.         android:layout_height="wrap_content" android:textColor="#000" /> 
  13.          
  14.     <ProgressBar android:id="@+id/progress_horizontal" 
  15.         style="?android:attr/progressBarStyleHorizontal"  
  16.         android:layout_below="@+id/text" 
  17.         android:layout_toRightOf="@+id/image" 
  18.         android:layout_width="fill_parent" android:layout_height="wrap_content" 
  19.         android:max="100" android:progress="50" android:secondaryProgress="75" /> 
  20.  
  21.  
  22. </RelativeLayout>  
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal" android:layout_width="fill_parent"
	android:layout_height="fill_parent">

	<ImageView android:id="@+id/image" android:layout_width="wrap_content"
		android:layout_height="fill_parent" />

	<TextView android:id="@+id/text" android:layout_width="wrap_content"
	    android:layout_toRightOf="@+id/image"
		android:layout_height="wrap_content" android:textColor="#000" />
		
	<ProgressBar android:id="@+id/progress_horizontal"
		style="?android:attr/progressBarStyleHorizontal" 
		android:layout_below="@+id/text"
		android:layout_toRightOf="@+id/image"
		android:layout_width="fill_parent" android:layout_height="wrap_content"
		android:max="100" android:progress="50" android:secondaryProgress="75" />


</RelativeLayout> 

 

效果图如下:

                                        

 

 

前面我们说过,NotificationManager是所有Notification的大管家,它的主要职责是加入/移除Notification。

  NotificationManager类

   通过获取系统服务来获取该对象:

      NotificationManager mNotificationManager = (NotificationManager)getSystemServic(Context.NOTIFICATION_SERVICE) ;

 

  常用方法:

        public  void cancelAll()                  移除所有通知         (只是针对当前Context下的Notification)

        public  void cancel(int id)              移除标记为id的通知 (只是针对当前Context下的所有Notification)

        public  voidnotify(String tag ,int id, Notification notification)              将通知加入状态栏, 标签为tag,标记为id

        public  void notify(int id, Notification notification)                                 将通知加入状态栏,,标记为id

 

Demo如下:

               说明: 示例Demo演示了创建两种不同类型的Notification , 实现起来也是很简单的。其实说到两种不同类型的使用

                 方式 ,其实内部原理是差不多的。

                PS : 自定义Notification复用了文章之前的布局文件,请知晓。

 

  1. package com.feixun.qin; 
  2.  
  3. import android.app.Activity; 
  4. import android.app.Notification; 
  5. import android.app.NotificationManager; 
  6. import android.app.PendingIntent; 
  7. import android.content.BroadcastReceiver; 
  8. import android.content.Context; 
  9. import android.content.Intent; 
  10. import android.content.IntentFilter; 
  11. import android.net.Uri; 
  12. import android.os.Bundle; 
  13. import android.provider.MediaStore.Audio; 
  14. import android.util.Log; 
  15. import android.view.View; 
  16. import android.widget.Button; 
  17. import android.widget.RemoteViews; 
  18. import android.widget.RemoteViews.RemoteView; 
  19.  
  20. publicclass MainActivity extends Activity { 
  21.  
  22.     private Button sendNotiBt; 
  23.     privateint count = 0
  24.  
  25.     /** Called when the activity is first created. */ 
  26.     @Override 
  27.     publicvoid onCreate(Bundle savedInstanceState) { 
  28.         super.onCreate(savedInstanceState); 
  29.         setContentView(R.layout.main); 
  30.         sendNotiBt = (Button) findViewById(R.id.sendNotiBt); 
  31.         sendNotiBt.setOnClickListener(new View.OnClickListener() { 
  32.  
  33.             @Override 
  34.             publicvoid onClick(View v) { 
  35.                 // TODO Auto-generated method stub  
  36.                 showDefaultNotification(); 
  37.             } 
  38.         }); 
  39.     } 
  40.  
  41.     //自定义显示的通知 ,创建RemoteView对象  
  42.     privatevoid showCustomizeNotification() { 
  43.  
  44.         CharSequence title = "i am new"
  45.         int icon = R.drawable.icon; 
  46.         long when = System.currentTimeMillis(); 
  47.         Notification noti = new Notification(icon, title, when + 10000); 
  48.         noti.flags = Notification.FLAG_INSISTENT; 
  49.          
  50.         // 1、创建一个自定义的消息布局 view.xml  
  51.         // 2、在程序代码中使用RemoteViews的方法来定义image和text。然后把RemoteViews对象传到contentView字段  
  52.         RemoteViews remoteView = new RemoteViews(this.getPackageName(),R.layout.notification); 
  53.         remoteView.setImageViewResource(R.id.image, R.drawable.icon); 
  54.         remoteView.setTextViewText(R.id.text , "通知类型为:自定义View"); 
  55.         noti.contentView = remoteView; 
  56.         // 3、为Notification的contentIntent字段定义一个Intent(注意,使用自定义View不需要setLatestEventInfo()方法)  
  57.         
  58.         //这儿点击后简单启动Settings模块  
  59.         PendingIntent contentIntent = PendingIntent.getActivity 
  60.                          (MainActivity.this, 0,new Intent("android.settings.SETTINGS"), 0); 
  61.         noti.contentIntent = contentIntent; 
  62.      
  63.         NotificationManager mnotiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
  64.         mnotiManager.notify(0, noti); 
  65.  
  66.     } 
  67.  
  68.     // 默认显示的的Notification  
  69.     privatevoid showDefaultNotification() { 
  70.         // 定义Notication的各种属性  
  71.          CharSequence title = "i am new"
  72.         int icon = R.drawable.icon; 
  73.         long when = System.currentTimeMillis(); 
  74.         Notification noti = new Notification(icon, title, when + 10000); 
  75.         noti.flags = Notification.FLAG_INSISTENT; 
  76.  
  77.         // 创建一个通知  
  78.         Notification mNotification = new Notification(); 
  79.  
  80.         // 设置属性值  
  81.         mNotification.icon = R.drawable.icon; 
  82.         mNotification.tickerText = "NotificationTest"
  83.         mNotification.when = System.currentTimeMillis(); // 立即发生此通知  
  84.  
  85.         // 带参数的构造函数,属性值如上  
  86.         // Notification mNotification = = new Notification(R.drawable.icon,"NotificationTest", System.currentTimeMillis()));  
  87.  
  88.         // 添加声音效果  
  89.         mNotification.defaults |= Notification.DEFAULT_SOUND; 
  90.  
  91.         // 添加震动,后来得知需要添加震动权限 : Virbate Permission  
  92.         //mNotification.defaults |= Notification.DEFAULT_VIBRATE ;   
  93.  
  94.         //添加状态标志   
  95.  
  96.         //FLAG_AUTO_CANCEL          该通知能被状态栏的清除按钮给清除掉  
  97.         //FLAG_NO_CLEAR                 该通知能被状态栏的清除按钮给清除掉  
  98.         //FLAG_ONGOING_EVENT      通知放置在正在运行  
  99.         //FLAG_INSISTENT                通知的音乐效果一直播放  
  100.         mNotification.flags = Notification.FLAG_INSISTENT ; 
  101.  
  102.         //将该通知显示为默认View  
  103.         PendingIntent contentIntent = PendingIntent.getActivity 
  104.                            (MainActivity.this, 0,new Intent("android.settings.SETTINGS"), 0); 
  105.         mNotification.setLatestEventInfo(MainActivity.this, "通知类型:默认View", "一般般哟。。。。",contentIntent); 
  106.          
  107.         // 设置setLatestEventInfo方法,如果不设置会App报错异常  
  108.         NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
  109.          
  110.         //注册此通知   
  111.         // 如果该NOTIFICATION_ID的通知已存在,会显示最新通知的相关信息 ,比如tickerText 等  
  112.         mNotificationManager.notify(2, mNotification); 
  113.  
  114.     } 
  115.      
  116.     privatevoid removeNotification() 
  117.     { 
  118.         NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
  119.         // 取消的只是当前Context的Notification  
  120.         mNotificationManager.cancel(2); 
  121.     }    
  122.  
  123.          
  124.          
posted @ 2013-03-12 19:57  天地乐  阅读(366)  评论(0编辑  收藏  举报