«

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

时间:2024-3-2 19:57     作者:韩俊     分类: Android


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()方法。具体使用方法如下:

[java] view
plaincopy

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

[java] view
plaincopy

<?xml version="1.0" encoding="utf-8"?>

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

&lt;ImageView android:id=&quot;@&#43;id/image&quot; android:layout_width=&quot;wrap_content&quot;  
    android:layout_height=&quot;fill_parent&quot; /&gt;  

&lt;TextView android:id=&quot;@&#43;id/text&quot; android:layout_width=&quot;wrap_content&quot;  
    android:layout_toRightOf=&quot;@&#43;id/image&quot;  
    android:layout_height=&quot;wrap_content&quot; android:textColor=&quot;#000&quot; /&gt;  

&lt;ProgressBar android:id=&quot;@&#43;id/progress_horizontal&quot;  
    style=&quot;?android:attr/progressBarStyleHorizontal&quot;   
    android:layout_below=&quot;@&#43;id/text&quot;  
    android:layout_toRightOf=&quot;@&#43;id/image&quot;  
    android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;wrap_content&quot;  
    android:max=&quot;100&quot; android:progress=&quot;50&quot; android:secondaryProgress=&quot;75&quot; /&gt;  

</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 void notify(String tag ,int id, Notification notification) 将通知加入状态栏, 标签为tag,标记为id

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

Demo如下:

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

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

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

[java] view
plaincopy

package com.feixun.qin;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.RemoteViews;
import android.widget.RemoteViews.RemoteView;

public class MainActivity extends Activity {

private Button sendNotiBt;  
private int count = 0;  

/** Called when the activity is first created. */  
@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);  
    sendNotiBt = (Button) findViewById(R.id.sendNotiBt);  
    sendNotiBt.setOnClickListener(new View.OnClickListener() {  

        @Override  
        public void onClick(View v) {  
            // TODO Auto-generated method stub  
            showDefaultNotification();  
        }  
    });  
}  

//自定义显示的通知 ,创建RemoteView对象  
private void showCustomizeNotification() {  

    CharSequence title = &quot;i am new&quot;;  
    int icon = R.drawable.icon;  
    long when = System.currentTimeMillis();  
    Notification noti = new Notification(icon, title, when &#43; 10000);  
    noti.flags = Notification.FLAG_INSISTENT;  

    // 1、创建一个自定义的消息布局 view.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 , &quot;通知类型为:自定义View&quot;);  
    noti.contentView = remoteView;  
    // 3、为Notification的contentIntent字段定义一个Intent(注意,使用自定义View不需要setLatestEventInfo()方法)  

    //这儿点击后简单启动Settings模块  
    PendingIntent contentIntent = PendingIntent.getActivity  
                     (MainActivity.this, 0,new Intent(&quot;android.settings.SETTINGS&quot;), 0);  
    noti.contentIntent = contentIntent;  

    NotificationManager mnotiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    mnotiManager.notify(0, noti);  

}  

// 默认显示的的Notification  
private void showDefaultNotification() {  
    // 定义Notication的各种属性  
     CharSequence title = &quot;i am new&quot;;  
    int icon = R.drawable.icon;  
    long when = System.currentTimeMillis();  
    Notification noti = new Notification(icon, title, when &#43; 10000);  
    noti.flags = Notification.FLAG_INSISTENT;  

    // 创建一个通知  
    Notification mNotification = new Notification();  

    // 设置属性&#20540;  
    mNotification.icon = R.drawable.icon;  
    mNotification.tickerText = &quot;NotificationTest&quot;;  
    mNotification.when = System.currentTimeMillis(); // 立即发生此通知  

    // 带参数的构造函数,属性&#20540;如上  
    // Notification mNotification = = new Notification(R.drawable.icon,&quot;NotificationTest&quot;, System.currentTimeMillis()));  

    // 添加声音效果  
    mNotification.defaults |= Notification.DEFAULT_SOUND;  

    // 添加震动,后来得知需要添加震动权限 : Virbate Permission  
    //mNotification.defaults |= Notification.DEFAULT_VIBRATE ;   

    //添加状态标志   

    //FLAG_AUTO_CANCEL          该通知能被状态栏的清除按钮给清除掉  
    //FLAG_NO_CLEAR                 该通知能被状态栏的清除按钮给清除掉  
    //FLAG_ONGOING_EVENT      通知放置在正在运行  
    //FLAG_INSISTENT                通知的音乐效果一直播放  
    mNotification.flags = Notification.FLAG_INSISTENT ;  

    //将该通知显示为默认View  
    PendingIntent contentIntent = PendingIntent.getActivity  
                       (MainActivity.this, 0,new Intent(&quot;android.settings.SETTINGS&quot;), 0);  
    mNotification.setLatestEventInfo(MainActivity.this, &quot;通知类型:默认View&quot;, &quot;一般般哟。。。。&quot;,contentIntent);  

    // 设置setLatestEventInfo方法,如果不设置会App报错异常  
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  

    //注册此通知   
    // 如果该NOTIFICATION_ID的通知已存在,会显示最新通知的相关信息 ,比如tickerText 等  
    mNotificationManager.notify(2, mNotification);  

}  

private void removeNotification()  
{  
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    // 取消的只是当前Context的Notification  
    mNotificationManager.cancel(2);  
}     

}

标签: android

热门推荐