`

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,CharSequencecontentText,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. */
	@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 = "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);

	}

	// 默认显示的的Notification
	private 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,以及如何实现普通通知和自定义视图通知。 首先,创建一个Notification需要以下步骤: 1. 创建Notification.Builder对象:这是构建Notification的...

    android Notification详解

    BarManagerService 中对 Notification 的封装,它包含了 Notification 的所有信息以及一些额外的状态,例如通知是否被用户阅读等。 Notification 功能 Notification 在 Android 系统中扮演着关键的角色,主要功能...

    Android SDK (SDK Platforms)-android-34-ext8.zip

    为了使用Android 34-ext8中的内容,开发者需要将其解压并添加到Android SDK的路径中,然后通过Android Studio或其他IDE配置项目以支持该版本的Android。这将确保应用能够与最新的Android特性兼容,并且能够在Android...

    androidsdk-platforms-android-26.rar

    - **通知通道(Notification Channels)**:Android Oreo 引入了通知通道的概念,使得开发者可以更精细化地管理应用的通知,用户也能根据需求自定义控制不同类型的提醒。 - **后台限制(Background Execution ...

    android notification完全解析Demo

    Notification是Android系统提供的一种通知用户的应用程序事件的方式,它可以在状态栏中显示图标、文字,用户可以点击通知来执行相应的操作,如打开应用、启动活动等。Notification具有优先级,可以根据重要性调整...

    android用户界面之Notification教程实例汇总

    Android通知Notification** - **链接**: [http://www.apkbus.com/android-51694-1-1.html](http://www.apkbus.com/android-51694-1-1.html) - **内容概述**: 本文是一篇全面介绍Notification的基础教程。它从...

    androidsdk-platforms-android-27.rar

    2. **Notification Channels**:在Android 8.1中,通知系统进行了重大改进,引入了通知渠道(Notification Channels)。这一特性要求开发者为每个类型的通知创建单独的通道,增强了用户对通知的控制,提高了用户体验...

    Android SDK (SDK Platforms)-android-24.zip

    《Android SDK (SDK Platforms) - android-24详解》 Android SDK(Software Development Kit)是开发者构建、调试和发布Android应用程序的重要工具集。在本文中,我们将深入探讨Android SDK中的"SDK Platforms"针对...

    Phonegap-LocalNotification-master

    要在项目中使用 `Phonegap-LocalNotification` 插件,首先需要确保已安装 PhoneGap 或 Cordova 环境。接着可以通过以下命令安装该插件: ```bash cordova plugin add ...

    android 通知Notification详解及实例代码

    下面我们将详细讲解Android通知Notification,并给出实例代码。 1. **创建Notification** 创建Notification通常使用`Notification.Builder`类,这是一个构建器模式,允许我们设置各种属性。首先,必须设置`...

    Android编程开发之NotiFication用法详解

    在Android编程中,Notification是应用与用户交互的重要方式,即使应用在后台运行或者完全关闭,也能提醒用户有新的事件需要处理。本篇文章将深入讲解Notification的用法,包括它的功能、使用技巧以及注意事项。 ...

    Android SDK (SDK Platforms)-android-25.zip

    《Android SDK (SDK Platforms) - android-25详解》 Android SDK(Software Development Kit)是开发者构建、调试和发布Android应用程序的重要工具集。在本文中,我们将深入探讨Android SDK中的"SDK Platforms"-...

    Android-Studio-28-Notification:这是一个通知项目

    Android-Studio-28-Notification项目就是一个专注于实践和理解Android通知机制的实例。在这个项目中,开发者将学习如何创建、管理和定制各种类型的通知。 **一、通知的基本结构** 通知通常由以下几个部分组成: 1...

    Android Notification使用方法详解

    本篇文章将详细介绍如何在Android 4.0及以上版本中使用Notification,以及如何处理兼容性问题。 ### 链式调用创建Notification 在Android 4.0及以上版本,推荐使用`Notification.Builder`类通过链式调用来构建...

    Android中Notification通知用法详解

    Android 中 Notification 通知用法详解 Android 中的 Notification 通知用法是指应用程序通过 NotificationManager 对象来管理和显示通知的方式。Notification 是 Android 系统中一个比较有特色的功能,当某个应用...

    最新Android开发工程师Android测试卷二--考试题

    【Android 开发工程师测试知识点详解】 1. **Activity**: - Activity是Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)之一。 - 它通常作为一个Java类实现,用于构建用户界面并与...

    Android代码-D-XXPlayer-android音乐播放器源码.zip

    【Android音乐播放器开发详解】 在移动设备领域,Android操作系统占据主导地位,而音乐播放器作为用户日常使用的重要应用之一,其开发技术自然备受关注。本文将深入探讨基于Android平台的音乐播放器——D-XXPlayer...

    Notification 使用详解(很全)

    在实际应用中,通常还需要考虑更多高级特性,如自定义视图、设置优先级、使用通知渠道(Android 8.0 及以上版本)、设置定时发送等。例如,你可以通过 `Notification.Builder` 类来构建更复杂的 `Notification`,并...

    最新版的android-support-v4.jar

    **Android Support Library v4详解** Android Support Library v4,简称support-v4,是Google为Android开发者提供的一款重要的库,它的存在使得开发者能够为更广泛的Android设备提供兼容性服务,包括那些运行旧版本...

    069集-Notification视频教程

    【Android Notification详解】 在Android应用开发中,Notification是一种至关重要的组件,它允许应用程序在状态栏中显示消息,即使用户不在与应用交互时也能提供信息反馈。"069集-Notification视频教程"深入讲解了...

Global site tag (gtag.js) - Google Analytics