Android开发 -- 状态栏通知Notification、NotificationManager详解

本想自己写一个的,但是看到这篇之后,我想还是转过来吧,实在是非常的详细:

在Android系统中,发一个状态栏通知还是很方便的。下面我们就来看一下,怎么发送状态栏通知,状态栏通知又有哪些参数可以设置?

首先,发送一个状态栏通知必须用到两个类:  NotificationManager 、 Notification。

NotificationManager :  是状态栏通知的管理类,负责发通知、清楚通知等。

NotificationManager 是一个系统Service,必须通过 getSystemService()方法来获取。

代码如下:

NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

Notification:是具体的状态栏通知对象,可以设置icon、文字、提示声音、振动等等参数。

下面是设置一个通知需要的基本参数:

An icon  (通知的图标)
    A title and expanded message  (通知的标题和内容)
    A PendingIntent   (点击通知执行页面跳转)

可选的设置:

A ticker-text message (状态栏顶部提示消息)
    An alert sound    (提示音)
    A vibrate setting  (振动)
    A flashing LED setting  (灯光)
    等等

一、创建Notification

通过NotificationManager  的 notify(int, Notification) 方法来启动Notification。

第一个参数唯一的标识该Notification,第二个参数就是Notification对象。

二、更新Notification

调用Notification的 setLatestEventInfo方法来更新内容,然后再调用NotificationManager的notify()方法即可。(具体可以看下面的实例)

三、删除Notification

通过NotificationManager  的cancel(int)方法,来清除某个通知。其中参数就是Notification的唯一标识ID。

当然也可以通过  cancelAll() 来清除状态栏所有的通知。

四、Notification设置(振动、铃声等)

1. 基本设置:

//新建状态栏通知

代码如下:

baseNF = new Notification();

//设置通知在状态栏显示的图标

代码如下:

baseNF.icon = R.drawable.icon;

//通知时在状态栏显示的内容

代码如下:

baseNF.tickerText = "You clicked BaseNF!";

//通知的默认参数 DEFAULT_SOUND, DEFAULT_VIBRATE, DEFAULT_LIGHTS.  
//如果要全部采用默认值, 用 DEFAULT_ALL. 
//此处采用默认声音

代码如下:

baseNF.defaults = Notification.DEFAULT_SOUND;

//第二个参数 :下拉状态栏时显示的消息标题 expanded message title 
//第三个参数:下拉状态栏时显示的消息内容 expanded message text 
//第四个参数:点击该通知时执行页面跳转

代码如下:

baseNF.setLatestEventInfo(Lesson_10.this, "Title01", "Content01", pd);

//发出状态栏通知 
//The first parameter is the unique ID for the Notification  
// and the second is the Notification object.

代码如下:

nm.notify(Notification_ID_BASE, baseNF);

配一张图作说明:

2. 添加声音

如果要采用默认声音,只要使用default就可以了。

代码如下:

baseNF.defaults = Notification.DEFAULT_SOUND;

如果要使用自定义声音,那么就要用到sound了。如下:

代码如下:

notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");[/code]

上面这种方法,使用的是自己的铃声,如果想用系统自带的铃声,可以这样:

[code]notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");

需要注意一点,如果default、sound同时出现,那么sound无效,会使用默认铃声。

默认情况下,通知的声音播放一遍就会结束。 如果你想让声音循环播放,需要为flags参数加上FLAG_INSISTENT。 这样声音会到用户响应才结束,比如下拉状态栏。

代码如下:

notification.flags |= notification.FLAG_INSISTENT;

3. 添加振动

如果是使用默认的振动方式,那么同样也是使用default。

代码如下:

notification.defaults |= Notification.DEFAULT_VIBRATE;

当然也可以自己定义振动形式,这边需要用到Long型数组。

代码如下:

long[] vibrate = {0,100,200,300};
notification.vibrate = vibrate;

这边的Long型数组中,第一个参数是开始振动前等待的时间,第二个参数是第一次振动的时间,第三个参数是第二次振动的时间,以此类推,随便定义多长的数组。但是采用这种方法,没有办法做到重复振动。

同样,如果default、vibrate同时出现时,会采用默认形式。

另外还需要注意一点:使用振动器时需要权限,如下:

代码如下:

<uses-permission android:name="android.permission.VIBRATE"></uses-permission>

4. 闪光

使用默认的灯光,如下:

代码如下:

notification.defaults |= Notification.DEFAULT_LIGHTS;

自定义:

代码如下:

notification.ledARGB = 0xff00ff00; 
notification.ledOnMS = 300; 
notification.ledOffMS = 1000; 
notification.flags |= Notification.FLAG_SHOW_LIGHTS;

其中ledARGB 表示灯光颜色、 ledOnMS 亮持续时间、ledOffMS 暗的时间。

注意:这边的颜色跟设备有关,不是所有的颜色都可以,要看具体设备。

5. 其他有用的设置:

flags:

//让声音、振动无限循环,直到用户响应

代码如下:

Notification.FLAG_INSISTENT;

//通知被点击后,自动消失

代码如下:

Notification.FLAG_AUTO_CANCEL;

//点击'Clear'时,不清楚该通知(QQ的通知无法清除,就是用的这个)

代码如下:

Notification.FLAG_NO_CLEAR;

下面附上我做的例子,供大家参考。 里面包括创建通知、更新通知、清除通知、设置自定义铃声、自定义振动、自定义通知视图等。

 

附上代码:

主类:

package com.yfz;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RemoteViews;
import android.widget.SeekBar;
import android.widget.TextView;
/**
 * Notification
 * @author Administrator
 *
 */
public class Lesson_10 extends Activity { 

 //BaseNotification
 private Button bt01; 

 //UpdateBaseNotification
 private Button bt02; 

 //ClearBaseNotification
 private Button bt03; 

 //MediaNotification
 private Button bt04; 

 //ClearMediaNotification
 private Button bt05; 

 //ClearALL
 private Button bt06; 

 //CustomNotification
 private Button bt07; 

 //通知管理器
 private NotificationManager nm; 

 //通知显示内容
 private PendingIntent pd; 

 @Override
  public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   /*加载页面*/
   setContentView(R.layout.lesson10); 

   init();
 } 

 private void init() {
  bt01 = (Button)findViewById(R.id.le10bt01);
  bt02 = (Button)findViewById(R.id.le10bt02);
  bt03 = (Button)findViewById(R.id.le10bt03);
  bt04 = (Button)findViewById(R.id.le10bt04);
  bt05 = (Button)findViewById(R.id.le10bt05);
  bt06 = (Button)findViewById(R.id.le10bt06);
  bt07 = (Button)findViewById(R.id.le10bt07); 

  bt01.setOnClickListener(onclick);
  bt02.setOnClickListener(onclick);
  bt03.setOnClickListener(onclick);
  bt04.setOnClickListener(onclick);
  bt05.setOnClickListener(onclick);
  bt06.setOnClickListener(onclick);
  bt07.setOnClickListener(onclick); 

  nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

  Intent intent = new Intent(this,Lesson_10.class); 

  pd = PendingIntent.getActivity(Lesson_10.this, 0, intent, 0);
 } 

 OnClickListener onclick = new OnClickListener() { 

  //BASE Notification ID
  private int Notification_ID_BASE = 110; 

  private Notification baseNF; 

  //Notification ID
  private int Notification_ID_MEDIA = 119; 

  private Notification mediaNF; 

  @Override
  public void onClick(View v) {
   switch(v.getId()) {
    case R.id.le10bt01:
     //新建状态栏通知
     baseNF = new Notification(); 

     //设置通知在状态栏显示的图标
     baseNF.icon = R.drawable.icon; 

     //通知时在状态栏显示的内容
     baseNF.tickerText = "You clicked BaseNF!"; 

     //通知的默认参数 DEFAULT_SOUND, DEFAULT_VIBRATE, DEFAULT_LIGHTS.
     //如果要全部采用默认值, 用 DEFAULT_ALL.
     //此处采用默认声音
     baseNF.defaults |= Notification.DEFAULT_SOUND;
     baseNF.defaults |= Notification.DEFAULT_VIBRATE;
     baseNF.defaults |= Notification.DEFAULT_LIGHTS; 

     //让声音、振动无限循环,直到用户响应
     baseNF.flags |= Notification.FLAG_INSISTENT; 

     //通知被点击后,自动消失
     baseNF.flags |= Notification.FLAG_AUTO_CANCEL; 

     //点击'Clear'时,不清楚该通知(QQ的通知无法清除,就是用的这个)
     baseNF.flags |= Notification.FLAG_NO_CLEAR; 

     //第二个参数 :下拉状态栏时显示的消息标题 expanded message title
     //第三个参数:下拉状态栏时显示的消息内容 expanded message text
     //第四个参数:点击该通知时执行页面跳转
     baseNF.setLatestEventInfo(Lesson_10.this, "Title01", "Content01", pd); 

     //发出状态栏通知
     //The first parameter is the unique ID for the Notification
     // and the second is the Notification object.
     nm.notify(Notification_ID_BASE, baseNF); 

     break; 

    case R.id.le10bt02:
     //更新通知
     //比如状态栏提示有一条新短信,还没来得及查看,又来一条新短信的提示。
     //此时采用更新原来通知的方式比较。
     //(再重新发一个通知也可以,但是这样会造成通知的混乱,而且显示多个通知给用户,对用户也不友好)
     baseNF.setLatestEventInfo(Lesson_10.this, "Title02", "Content02", pd);
     nm.notify(Notification_ID_BASE, baseNF);
     break; 

    case R.id.le10bt03: 

     //清除 baseNF
     nm.cancel(Notification_ID_BASE);
     break; 

    case R.id.le10bt04:
     mediaNF = new Notification();
     mediaNF.icon = R.drawable.icon;
     mediaNF.tickerText = "You clicked MediaNF!"; 

     //自定义声音
     mediaNF.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6"); 

     //通知时发出的振动
     //第一个参数: 振动前等待的时间
     //第二个参数: 第一次振动的时长、以此类推
     long[] vir = {0,100,200,300};
     mediaNF.vibrate = vir; 

     mediaNF.setLatestEventInfo(Lesson_10.this, "Title03", "Content03", pd); 

     nm.notify(Notification_ID_MEDIA, mediaNF);
     break; 

    case R.id.le10bt05:
     //清除 mediaNF
     nm.cancel(Notification_ID_MEDIA);
     break; 

    case R.id.le10bt06:
     nm.cancelAll();
     break; 

    case R.id.le10bt07:
     //自定义下拉视图,比如下载软件时,显示的进度条。
     Notification notification = new Notification(); 

     notification.icon = R.drawable.icon;
     notification.tickerText = "Custom!"; 

     RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom);
     contentView.setImageViewResource(R.id.image, R.drawable.icon);
     contentView.setTextViewText(R.id.text, "Hello, this message is in a custom expanded view");
     notification.contentView = contentView; 

     //使用自定义下拉视图时,不需要再调用setLatestEventInfo()方法
     //但是必须定义 contentIntent
     notification.contentIntent = pd; 

     nm.notify(3, notification);
     break;
   }
  }
 }; 

}

主页面:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical">
 <Button
  android:id="@+id/le10bt01"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="BaseNotification"
 />
 <Button
  android:id="@+id/le10bt02"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="UpdateBaseNotification"
 />
 <Button
  android:id="@+id/le10bt03"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="ClearBaseNotification"
 />
 <Button
  android:id="@+id/le10bt04"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="MediaNotification"
 />
 <Button
  android:id="@+id/le10bt05"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="ClearMediaNotification"
 />
 <Button
  android:id="@+id/le10bt06"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="ClearALL"
 />
 <Button
  android:id="@+id/le10bt07"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="CustomNotification"
 />
</LinearLayout> 

自定义视图页面:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="3dp"
    >
 <ImageView android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_marginRight="10dp"
    />
 <TextView android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:textColor="#000"
    />
</LinearLayout>
(0)

相关推荐

  • Android编程实现拦截短信并屏蔽系统Notification的方法

    本文实例讲述了Android编程实现拦截短信并屏蔽系统Notification的方法.分享给大家供大家参考,具体如下: 拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收"SMS的权限 <uses-permission android:name="android.permission.RECEIVE_SMS"> </uses-permission> <uses-p

  • Android中通过Notification&NotificationManager实现消息通知

    notification是一种让你的应用程序在没有开启情况下或在后台运行警示用户.它是看不见的程序组件(Broadcast Receiver,Service和不活跃的Activity)警示用户有需要注意的事件发生的最好途径. 1.新建一个android项目 我新建项目的 minSdkVersion="11",targetSdkVersion="19".也就是支持最低版本的3.0的. 2.习惯性地打开项目清单文件AndroidManifest.xml,添加一个权限:&

  • android中创建通知栏Notification代码实例

    ///// 第一步:获取NotificationManager NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); ///// 第二步:定义Notification Intent intent = new Intent(this, OtherActivity.class); //PendingIntent是待执行的Intent PendingIntent pi

  • android notification 的总结分析

    分类 notification有以下几种: 1>普通notification 1.内容标题 2.大图标 3.内容 4.内容附加信息 5.小图标 6.时间 2>大布局Notification 图1 大布局notification是在android4.1以后才增加的,大布局notification与小布局notification只在'7'部分有区别,其它部分都一致.大布局notification只有在所有notification的最上 面时才会显示大布局,其它情况下显示小布局.你也可以用手指将其扩

  • Android Notification.Builder通知案例分享

    随着Android系统的不断升级,相关Notification的用法有很多种,有的方法可能已经被android抛弃了,下面为大家分享一下个人如何实现Android Notification通知小案例源代码,供大家参考. Android Notification.Builder通知小案例,具体代码示例如下: package com.example.day6ke; import android.app.Notification; import android.app.NotificationMana

  • Android中通知Notification使用实例(振动、灯光、声音)

    本文实例讲解了通知Notification使用方法,此知识点就是用作通知的显示,包括振动.灯光.声音等效果,分享给大家供大家参考,具体内容如下 效果图: MainActivity: import java.io.File; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; im

  • Android界面 NotificationManager使用Bitmap做图标

    今天看到EOE问答里面有这"[Android 界面]NotificationManager 如何使用Bitmap做图标"这样一个问题,在论坛搜索也没有好的案例 特写一个简单的demo供大家参考 今天发布的是NotificationManager 使用Bitmap做图标 关键code 复制代码 代码如下: public void notification(int flag) { Notification notification = new Notification(); //设置sta

  • android使用NotificationListenerService监听通知栏消息

    NotificationListenerService是通过系统调起的服务,在应用发起通知时,系统会将通知的应用,动作和信息回调给NotificationListenerService.但使用之前需要引导用户进行授权.使用NotificationListenerService一般需要下面三个步骤. 注册服务 首先需要在AndroidManifest.xml对service进行注册. <service android:name=".NotificationCollectorService&q

  • Android中关于Notification及NotificationManger的详解

    Android状态栏提醒 在Android中提醒功能也可以用AlertDialog,但是我们要慎重的使用,因为当使用AlertDialog的时候,用户正在进行的操作将会被打断,因为当前焦点被AlertDialog得到.我们可以想像一下,当用户打游戏正爽的时候,这时候来了一条短信.如果这时候短信用AlertDialog提醒,用户必须先去处理这条提醒,从而才能继续游戏.用户可能会活活被气死.而使用Notification就不会带来这些麻烦事,用户完全可以打完游戏再去看这条短信.所以在开发中应根据实际

  • 详解Android中Notification通知提醒

    在消息通知时,我们经常用到两个组件Toast和Notification.特别是重要的和需要长时间显示的信息,用Notification就最 合适不过了.当有消息通知时,状态栏会显示通知的图标和文字,通过下拉状态栏,就可以看到通知信息了,Android这一创新性的UI组件赢得了用户的一 致好评,就连苹果也开始模仿了.今天我们就结合实例,探讨一下Notification具体的使用方法.  首先说明一下我们需要实现的功能是:在程序启动时,发出一个通知,这个通知在软件运行过程中一直存在,相当于qq的托盘

随机推荐