android学习十三(android的通知使用)

通知(Notification)是android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一条通知后,手机最上方的状态栏会显示一个通知的图标,下拉状态后可以看到通知的详细内容。

通知的基本用法

通知可以在活动,广播接收器,和服务里面创建。无论在哪里创建通知,整体的步骤都是相同的,下面我们来学习详细的步骤。

/*
	 * 首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSystemService()方法
	 * 获取到。getSystemService方法接收一个字符串参数用于确定获取系统的哪个服务,这里我们传入的
	 * Context.NOTIFICATION_SERVICE即可。因此获取NotificationManager的实例就可以写成:
	 * NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
	 * 接下来要创建一个Notification对象,这个对象用于存储通知所需的各种信息,我们使用它的构造函数来进行创建。
	 * Notification的有参构造函数接收三个参数,第一个参数用于指定通知的图标,比如项目的res/drawable目录
	 * 下有一张ic_launcher图片,那么这里就可以传入R.drawable.ic_launcher,第二个参数用于指定通知
	 * 的ticker内容,当通知刚被创建的时候,它会在系统的状态栏一闪而过,属于瞬时的提示信息。第三个参数用于
	 * 指定通知被创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。因此创建
	 * 一个Notification对象就可以写成:
	 * Notification notification=new Notification(R.drawable.ic_launcher,
					"this is ticker text",System.currentTimeMillis());

	* 创建好了Notification对象后,我们还需要对通知的布局进行设定,这里只需要调用Notification的
	* setLatestEventInfo()方法就可以给通知设置一个标准布局。这个方法接收四个参数,第一个参数
	* 是Context。第二个参数用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。第三个参数用于指定
	* 通知的正文内容,同样下拉系统状态栏就可以看到这部分内容。第四个参数我们暂时用不到,可以传入null。因此
	* 对通知的布局进行设定就可以写成:
	* notification.setLatestEventInfo(this, "this is content title",
					"this is content text", null);
	  以上工作都做完了后,只需要调用NotificationManager的notify()方法就可以让通知显示出来了。
	  notify()方法接收2个参数,第一个参数是id,要保证为每个通知所指定的id都是不同的。第二个参数则是
	  Notification对象,这里直接将我们刚刚创建好的Notification对象传入即可。因此,显示一个通知就可以
	  写成:
	  manager.notify(1,notification);
	* */

新建一个项目,项目名为NotificationTest,并修改activity_main.xml中的代码,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <Button
        android:id="@+id/send_notice"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="send notice"
        />

</LinearLayout>

修改MainActivity中的代码:

package com.jack.notificationtest;

import android.os.Bundle;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.content.IntentSender.SendIntentException;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

	/*
	 * 首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSystemService()方法
	 * 获取到。getSystemService方法接收一个字符串参数用于确定获取系统的哪个服务,这里我们传入的
	 * Context.NOTIFICATION_SERVICE即可。因此获取NotificationManager的实例就可以写成:
	 * NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
	 * 接下来要创建一个Notification对象,这个对象用于存储通知所需的各种信息,我们使用它的构造函数来进行创建。
	 * Notification的有参构造函数接收三个参数,第一个参数用于指定通知的图标,比如项目的res/drawable目录
	 * 下有一张ic_launcher图片,那么这里就可以传入R.drawable.ic_launcher,第二个参数用于指定通知
	 * 的ticker内容,当通知刚被创建的时候,它会在系统的状态栏一闪而过,属于瞬时的提示信息。第三个参数用于
	 * 指定通知被创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。因此创建
	 * 一个Notification对象就可以写成:
	 * Notification notification=new Notification(R.drawable.ic_launcher,
					"this is ticker text",System.currentTimeMillis());

	* 创建好了Notification对象后,我们还需要对通知的布局进行设定,这里只需要调用Notification的
	* setLatestEventInfo()方法就可以给通知设置一个标准布局。这个方法接收四个参数,第一个参数
	* 是Context。第二个参数用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。第三个参数用于指定
	* 通知的正文内容,同样下拉系统状态栏就可以看到这部分内容。第四个参数我们暂时用不到,可以传入null。因此
	* 对通知的布局进行设定就可以写成:
	* notification.setLatestEventInfo(this, "this is content title",
					"this is content text", null);
	  以上工作都做完了后,只需要调用NotificationManager的notify()方法就可以让通知显示出来了。
	  notify()方法接收2个参数,第一个参数是id,要保证为每个通知所指定的id都是不同的。第二个参数则是
	  Notification对象,这里直接将我们刚刚创建好的Notification对象传入即可。因此,显示一个通知就可以
	  写成:
	  manager.notify(1,notification);
	* */

	private Button sendNotice;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		sendNotice=(Button) findViewById(R.id.send_notice);
		sendNotice.setOnClickListener(this);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch(v.getId()){
		case R.id.send_notice:
			NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
			Notification notification=new Notification(R.drawable.ic_launcher,
					"this is ticker text",System.currentTimeMillis());
			notification.setLatestEventInfo(this, "this is content title",
					"this is content text", null);
			manager.notify(1,notification);
			break;
		default:
			break;
		}
	}

}

运行程序,点击森达 notice界面如下:

下拉系统状态栏可以看到该通知的详细信息,如下所示:

上面的通知,我们不能点击,如果要想实现通知的点击效果,我们就要在代码中进行相应的设置,这涉及到了PendingIntent。PendingIntent和Intent有些类似,它们之间也确实存在在不少共同点。比如它们都可以去指明一个“意图”,都可以用于启动活动,启动服务以及发送广播等。不同的是Intent更倾向于立刻执行某个动作,而PendingIntent更倾向于在某个合适的时机去执行某个动作。所以也可以把PendingIntent简单的理解为延迟执行的Intent。

PendingIntent的用法比较简单,它主要提供了几个静态方法用于获取PendingIntent的实例,可以根据需求来选择是使用getActivity()方法,getBroadcast()方法,还是getService()方法。这几个方法所接收的参数都是相同的,第一个参数依旧是Context。第二个参数一般用不到,通常传入0即可。第三个参数是一个Intent对象,我们可以通过这个对象构建出PendingIntent的“意图”。第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT
和  FLAG_UPDATE_CURRENT这四种值可选,每种值的含义,可以自己查询下。

还记得Notification的setLatestEventInfo()方法。刚才我们将setLatestEventInfo()的第四个参数忽略掉了,直接传入了null,现在你会发现,第四个参数正是一个PendingIntent对象。因此,这里就可以通过PendingIntent构建出一个延迟执行的“意图”,当用户点击这条通知时就会执行相应的逻辑。

现在我们来优化下NotificationTest项目,给刚才的通知加上点击功能,让用户点击它的时候可以启动另一个活动。

首先需要准备好一个活动,这里新建布局文件notification_layout.xml,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:text="this is notificaiton layout"
        />

</LinearLayout>

新建NotificationActivity类继承Activity,加载上面定义的布局,代码如下所示:

package com.jack.notificationtest;

import android.app.Activity;
import android.os.Bundle;

public class NotificationActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.notification_layout);
	}

}

修改AndroidManifest.xml中的代码,在里面加入NotificationActivity的注册声明:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jack.notificationtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="13"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.jack.notificationtest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name="com.jack.notificationtest.NotificationActivity"
            ></activity>

    </application>

</manifest>

下面在修改MainActivity中的代码给通知加入点击功能,如下所示:

@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch(v.getId()){
		case R.id.send_notice:
			NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
			Notification notification=new Notification(R.drawable.ic_launcher,
					"this is ticker text",System.currentTimeMillis());

			Intent intent=new Intent(this,NotificationActivity.class);
			PendingIntent pi=PendingIntent.getActivity(this, 0,
					intent, PendingIntent.FLAG_CANCEL_CURRENT);

			notification.setLatestEventInfo(this, "this is content title",
					"this is content text", pi);
			manager.notify(1,notification);
			break;
		default:
			break;
		}
	}

重新运行下程序,并点击send notice按钮,依旧会发出一条通知,让回下拉系统状态栏,点击下该通知,就会看到NotificationActivity这个活动界面了。如下所示:

注意看,你会发现系统状态上面的图标还没有消失,这是为什么了?这是因为,如果我们没有在代码中对该通知进行取消,它会一直在系统的状态栏上显示。解决的方法也比较简单的,调用NotificationManager的cancel()方法就可以取消通知了。修改NotificationActivity中的代码,如下所示:

package com.jack.notificationtest;

import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Bundle;

public class NotificationActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.notification_layout);
		NotificationManager manager=(NotificationManager)
				getSystemService(Context.NOTIFICATION_SERVICE);
		manager.cancel(1);
		/*
		 * 我们在cancel()方法中传入了1,这个1是什么意思了?这是我们给这条通知设置的id就是1。
		 * 因此如果,你想要取消哪一条通知,就在cancel()方法中传入该通知的id就行了。
		 * */
	}

}

通知的高级技巧

观察Notification这个类,你会发现我们还有很多的属性,没有使用。先来看看sound这个属性吧,它可以在通知发出的时候播出一段音频,这样就能够更好地告知用户有通知到来。sound这个属性是一个Uri对象,所以在指定音频文件的时候还需要先获取音频文件对应的URI。比如说手机的/system/media/audio/ringtongs目录下有一个basic_tone.ogg音频文件,那么在代码中这样就可以这样指定:

Uri soundUri=Uri.parse(new File("/system/media/audio/ringtongs/basic_tone.ogg"));

notification.sound=soundUri;

除允许播放音频以外,我们还可以在通知到来的时候让手机进行震动,使用的是vibrate这个属性。它是一个长整形的数组,由于设置手机静止和震动的时长,以毫秒为单位。下标0的值表示手机静止的时长,下标为1的值表示手机震动的时长,下标为2的值又表示手机静止的时长,以此类推。所以,如果想要手机在通知到来的时候立刻震动1秒,然后静止1秒,在震动,代码就可以写成:

long[] vibrates={0,1000,1000,1000};

notification.vibrate=vibrates;

不过想要控制手机震动还需要声明权限,因此,我们还得编辑AndroidManifest.xml文件,加入如下说明:

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

学会控制通知的声音和震动,下面我们来看看如何在通知到来的时候控制手机LED灯的显示。

现在的手机基本上都会前置一个LED灯,当有未接电话或未读短信,而此时手机又处于锁屏状态时LED灯就会不停地闪烁,提醒用户去查看。我们可以使用ledARGB,ledOnMS,ledOffMS以及flags这几个属性来实现这种效果。ledARGB用于控制LED灯的颜色,一般有红绿蓝三种颜色可选。ledOnMS用于指定LED灯亮起的时长,以毫秒为单位。edOffMS由于指定LED灯暗去的时长,也是以毫秒为单位。flags可用于指定通知的一些行为,其中就包括显示LED灯这一选项。所以,等通知到来时,如果想要实现LED灯以绿色的灯一闪一闪的效果,就可以写成:

notification.ledARGB=Color.GREEN;

notification.ledOnMS=1000;

notification.ledOffMS=1000;

notification.flags=Notification.FLAG_SHOW_LIGHTS;

当然,如果你不想进行那么多繁琐的设置,也可以直接使用通知的默认效果,它会根据当前手机的环境来决定播放什么铃声,以及如何震动,写法如下:

notification.defaults=Notification.DEFAULT_ALL;

注意:以上所涉及的这些高级技巧都要在真机上面运行,才能看到效果,模拟器无法表现出震动,以及LED灯闪烁等功能。

通知就总结到这了额,下面一篇将进行短信的接收与发送总结。

转载请注明:http://blog.csdn.net/j903829182/article/details/41181277

时间: 2024-10-15 04:13:21

android学习十三(android的通知使用)的相关文章

[Android学习笔记]Android中多线程开发的一些概念

线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关工作就叫做线程同步. android中,处理线程同步的手段就是:锁 一般分为公平锁和非公平锁: synchronized(内部锁,互斥锁):synchronized是JVM提供的线程同步机制,如果出现问题,JVM能捕获异常,并释放资源,具体实现机制需要查看JVM源码 synchronized的使用特

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

Android学习——在Android中使用OpenCV的第一个程序

刚开始学习Android,由于之前比较熟悉OpenCV,于是就想先在Android上运行OpenCV试试 =================================================================================== 1.环境配置 JDK Eclipse ADT CDT Android SDK Android NDK cygwin OpenCV for Android 2.4.9 这部分网上很多,我就不再赘述了,可以参考:http://bl

[Android学习笔记]Android向下兼

Android向下兼容的思路:使用高版本的API,在运行时判断真实运行平台的API版本,根据不同版本做不同的处理 关键类:Build.class里面定义了API版本相关信息 内部类:VERSION定义当前系统的版本信息,其中包含SDK版本信息Build.VERSION.SDK_INT可以获取到当前运行的系统的SDK版本号 内部类:VERSION_CODES定义了各个版本的枚举信息 适配时: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONE

Android学习笔记-Android应用程序初步认识

一直觉得自己的技术没有一门专长,似乎什么都会一点,但是却一点都不深入.决定学习Android的开发,说不出的理由,希望自己能够坚持下去. 其实之前已经搭建好了Android的开发环境eclipse+ADT+SDK,这里就不做具体介绍了,个人觉得还是非常有必要把这3个软件单独安装一下, 这样对开发工具能有个系统的认识.Eclipse是一个IDE,针对多门开发语言都能够使用,SDK是针对Android应用开发提供的一个框架,其中有开发 过程中使用到的包和一些集成的工具,ADT是安装在eclipse上

[Android学习十一]Android开发单元测试

网上关于Android单元测试的文字帖子不胜枚举,看完之后能解决问题是好事,不能解决问题那就是浪费时间和经历.大多数文章来自于这篇文章:http://rexstjohn.com/unit-testing-with-android-studio/       自从投入到Android Studio IDE之后基本上就赖着不走了.这里仅讨论AS(Android Studio)中Android单元测试.           开发一个Android应用单元测试这种程序员的自我修养和基本道德测试是必不可少

Android学习十---Android Camera

Android camera用来拍照和拍摄视频的先看一下最后实现的效果图             最后的效果图 一.准备 在你的应用程序上使用android拍照设备,需要考虑以下几个方面 1. 是否是一定需要camera 如果需要,那么就无法安装在没有摄像头的设备. 需要在mainfest 中声明 <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:nam

(转)Android学习笔记 --- android任务栈和启动模式

1.一个应用程序一般都是由多个activity组成的,任务栈(task stack),记录和存放用户开启的activity. 2.当一个应用程序被打开时,系统就会给他分配拟一个任务栈,当任务栈中所有的activity都退出的时候,任务栈就清空了.任务栈中的id是一个integer的数据类型(自增长的). 3.在android操作系统里面会存在多个任务栈,一个应用程序对应一个任务栈. 4.默认情况下,关闭掉一个应用程序,系统就会清空了这个应用程序.但是应用程序的进程还会被保留 为什么要引入任务栈的

Android学习路径——Android的四个组成部分activity(一)

一.什么是Activity? Activity简单的说就是一个接口.我们是Android手机上看到的每个界面就是一个activity. 二.Activity的创建 1.定义一个类继承activity,然后在清单文件manifest.xml文件的application节点下注冊activity.这个activity就创建成功了. public class MyActivity extends Activity { } 2.清单文件注冊activity <application android:al