Android中通知的使用-----Notification详解
来源:互联网 发布:复旦大学mba 知乎 编辑:程序博客网 时间:2024/05/01 01:02
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()方法。具体使用方法如下:
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
<?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 void notify(String tag ,int id, Notification notification) 将通知加入状态栏, 标签为tag,标记为id
public void notify(int id, Notification notification) 将通知加入状态栏,,标记为id
Demo如下:
说明: 示例Demo演示了创建两种不同类型的Notification , 实现起来也是很简单的。其实说到两种不同类型的使用
方式 ,其实内部原理是差不多的。
PS : 自定义Notification复用了文章之前的布局文件,请知晓。
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. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);sendNotiBt = (Button) findViewById(R.id.sendNotiBt);sendNotiBt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubshowDefaultNotification();}});}//自定义显示的通知 ,创建RemoteView对象private void showCustomizeNotification() {CharSequence title = "i am new";int icon = R.drawable.icon;long when = System.currentTimeMillis();Notification noti = new Notification(icon, title, when + 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 , "通知类型为:自定义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;NotificationManager mnotiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);mnotiManager.notify(0, noti);}// 默认显示的的Notificationprivate void showDefaultNotification() { // 定义Notication的各种属性 CharSequence title = "i am new"; int icon = R.drawable.icon; long when = System.currentTimeMillis(); Notification noti = new Notification(icon, title, when + 10000); noti.flags = Notification.FLAG_INSISTENT; // 创建一个通知 Notification mNotification = new Notification(); // 设置属性值 mNotification.icon = R.drawable.icon; mNotification.tickerText = "NotificationTest"; mNotification.when = System.currentTimeMillis(); // 立即发生此通知 // 带参数的构造函数,属性值如上 // Notification mNotification = = new Notification(R.drawable.icon,"NotificationTest", 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("android.settings.SETTINGS"), 0); mNotification.setLatestEventInfo(MainActivity.this, "通知类型:默认View", "一般般哟。。。。",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中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android的通知(Notification)使用详解
- Android的通知(Notification)使用详解
- Android的通知(Notification)使用详解
- android中通知栏notification的使用
- Notification,Android中通知的使用
- Android中Notification 通知的使用
- Android中Notification 通知的使用
- Android通知(Notification)使用详解
- 访问在 WINS 数据库时的错误消息: 找不到 WINS 服务器
- 牛人面试intel
- Android Activity与Intent机制
- Greenplum参数配置优化
- Arcgis Server 配置过程常见错误解决
- Android中通知的使用-----Notification详解
- 安装mysql数据库 文档
- C++ 内存布局 变量在堆栈的分配
- 如何在对话框中嵌入浏览器
- 计算机能思考吗?图1专题6:“人脑是计算机吗?”
- C# List<T>用法
- python model字段类型
- Oracle中"HINT"的30个用法
- 指令大全 - shutdown,halt,reboot,init