Android开发之使用Notification.Builder

通知的主要功能是提示功能。例如:短信、推送信息等等。

大体使用步骤:

1.获取状态通知栏管理

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

notificationManager = (NotificationManager) this
				.getSystemService(NOTIFICATION_SERVICE);

2.实例化通知栏构造器NotificationCompat.Builder

3.设置NotificationCompat.Builder

4.设置PendingIntent

5.显示

方法或参数介绍:

1.PendingIntent

PendingIntent.getBroadcast(context, requestCode, intent, flags)

PendingIntent.getActivities(context, requestCode, intents, flags)

PendingIntent.getService(context, requestCode, intent, flags)

中的flags属性参数:

FLAG_ONE_SHOT   表示返回的PendingIntent仅能执行一次,执行完后自动取消

FLAG_NO_CREATE     表示如果描述的PendingIntent不存在,并不创建相应的PendingIntent,而是返回NULL

FLAG_CANCEL_CURRENT      表示相应的PendingIntent已经存在,则取消前者,然后创建新的PendingIntent

FLAG_UPDATE_CURRENT     表示更新的PendingIntent

2.notification.flags参数介绍

Notification.FLAG_SHOW_LIGHTS              //三色灯提醒,在使用三色灯提醒时候必须加该标志符

Notification.FLAG_ONGOING_EVENT          //发起正在运行事件(活动中)

Notification.FLAG_INSISTENT   //让声音、振动无限循环,直到用户响应 (取消或者打开)

Notification.FLAG_ONLY_ALERT_ONCE  //发起Notification后,铃声和震动均只执行一次

Notification.FLAG_AUTO_CANCEL      //用户单击通知后自动消失

Notification.FLAG_NO_CLEAR          //只有全部清除时,Notification才会清除 ,不清楚该通知(QQ的通知无法清除,就是用的这个)

Notification.FLAG_FOREGROUND_SERVICE    //表示正在运行的服务

使用方法:

在设置完属性后,设置

Notification notification =builder.build();
notification.flags =Notification.FLAG_ONLY_ALERT_ONCE;

3.setVibrate(long[] pattern)

设置震动,需要权限.

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

4.builder.setOngoing( )

设置为ture,表示它为一个正在进行的通知。简单的说,当为ture时,不可以被侧滑消失。

***************************************************************************************

使用自定义Notification,就要使用RemoteViews。

***************************************************************************************

使用实例:

图片:

   

实现代码:

MainActivity.java

public class MainActivity extends Activity {

	Button button, button2;
	NotificationManager notificationManager;
	public final static String NEWS_LISTEN = "broadcast";

	// 用于自定义Notification,点击事件的验证
	String remoteViewsText = "未点击";

	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		notificationManager = (NotificationManager) this
				.getSystemService(NOTIFICATION_SERVICE);

		IntentFilter filter = new IntentFilter();
		filter.addAction(NEWS_LISTEN);
		this.registerReceiver(broadcastReceiver, filter);

	}

	public void click(View v) {

		switch (v.getId()) {
		case R.id.but:// 使用普通的Notification

			Notification.Builder builder = new Notification.Builder(
					MainActivity.this);

			Intent intent = new Intent(MainActivity.this, SecondActivity.class);
			PendingIntent pendingIntent = PendingIntent.getActivity(
					MainActivity.this, 0, intent,
					PendingIntent.FLAG_UPDATE_CURRENT);

			builder.setContentIntent(pendingIntent);
			builder.setSmallIcon(R.drawable.close);// 设置图标
			builder.setWhen(System.currentTimeMillis());// 设置通知来到的时间
			// builder.setAutoCancel(true);
			builder.setContentTitle("标题");// 设置通知的标题
			builder.setContentText("内容");// 设置通知的内容
			builder.setTicker("状态栏上显示");// 状态栏上显示
			builder.setOngoing(true);

			/*
			 * // 设置声音(手机中的音频文件) String path =
			 * Environment.getExternalStorageDirectory() .getAbsolutePath() +
			 * "/Music/a.mp3"; File file = new File(path);
			 * builder.setSound(Uri.fromFile(file));
			 */

			// 获取Android多媒体库内的铃声
			builder.setSound(Uri.withAppendedPath(
					Audio.Media.INTERNAL_CONTENT_URI, "5"));

			// builder.setVibrate(new long[]{2000,1000,4000}); //需要真机测试
			Notification notification = builder.build();
			// notification.flags =Notification.FLAG_ONGOING_EVENT;

			notificationManager.notify(0, notification);

			break;

		case R.id.but2:// 使用自定义的Notification
			// 3.0之前不支持Button
			MyNotification();

			break;

		case R.id.but3:// 使用下载的Notification,在4.0以后才能使用

			final Notification.Builder builder3 = new Notification.Builder(
					MainActivity.this);
			builder3.setSmallIcon(R.drawable.ic_launcher)
					.setTicker("showProgressBar").setContentInfo("contentInfo")
					.setOngoing(true).setContentTitle("ContentTitle")
					.setContentText("ContentText");
			// 模拟下载过程
			new Thread(new Runnable() {
				@Override
				public void run() {

					int progress = 0;

					for (progress = 0; progress < 100; progress += 5) {
						// 将setProgress的第三个参数设为true即可显示为无明确进度的进度条样式
						builder3.setProgress(100, progress, false);

						notificationManager.notify(0, builder3.build());
						try {
							Thread.sleep(1 * 1000);
						} catch (InterruptedException e) {
							System.out.println("sleep failure");
						}
					}
					builder3.setContentTitle("Download complete")
							.setProgress(0, 0, false).setOngoing(false);
					notificationManager.notify(0, builder3.build());

				}
			}).start();

			break;
		case R.id.but4:// 大布局通知在4.1以后才能使用,BigTextStyle

			Notification.BigTextStyle textStyle = new Notification.BigTextStyle();
			textStyle.setBigContentTitle("大标题")
					// 标题
					.setSummaryText("SummaryText")
					.bigText(
							"Big Text!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
									+ "!!!!!!!!!!!"
									+ "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");// 内容
			Notification.Builder builder2 = new Notification.Builder(
					MainActivity.this);
			builder2.setSmallIcon(R.drawable.icon);// 小图标
			// 大图标
			builder2.setLargeIcon(BitmapFactory.decodeResource(
					this.getResources(), R.drawable.close));
			builder2.setTicker("showBigView_Text")
					.setContentInfo("contentInfo");
			builder2.setStyle(textStyle);
			builder2.setAutoCancel(true);

			notificationManager.notify(0, builder2.build());

			break;

		case R.id.but5://大布局通知在4.1以后才能使用,大布局图片

			Notification.BigPictureStyle bigPictureStyle = new Notification.BigPictureStyle();
			bigPictureStyle.bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.back));

			Notification.Builder builder4 = new Notification.Builder(
					MainActivity.this);
			builder4.setSmallIcon(R.drawable.icon);// 小图标
			// 大图标
			builder4.setLargeIcon(BitmapFactory.decodeResource(
					this.getResources(), R.drawable.close));
			builder4.setTicker("showBigView_Picture")
					.setContentInfo("contentInfo");
			builder4.setStyle(bigPictureStyle);
			builder4.setAutoCancel(true);

			notificationManager.notify(0, builder4.build());

			break;

		case R.id.but6://大布局通知在4.1以后才能使用,InboxStyle

			Notification.InboxStyle inboxStyle = new Notification.InboxStyle();
			inboxStyle.setBigContentTitle("InboxStyle");
			inboxStyle.setSummaryText("Test");
			for(int i =0 ;i<5;i++){
				inboxStyle.addLine("new:"+i);
			}

			Notification.Builder builder5 = new Notification.Builder(
					MainActivity.this);
			builder5.setSmallIcon(R.drawable.icon);// 小图标
			// 大图标
			builder5.setLargeIcon(BitmapFactory.decodeResource(
					this.getResources(), R.drawable.close));
			builder5.setTicker("showBigView_InboxStyle")
					.setContentInfo("contentInfo");
			builder5.setStyle(inboxStyle);
			builder5.setAutoCancel(true);

			notificationManager.notify(0, builder5.build());

			break;

		}

	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		// 取消广播接收
		this.unregisterReceiver(broadcastReceiver);
	}

	/**
	 * 自定义Notification
	 */
	public void MyNotification() {

		RemoteViews remoteViews = new RemoteViews(getPackageName(),
				R.layout.form);
		remoteViews.setTextViewText(R.id.tv_form, remoteViewsText);

		Intent intent2 = new Intent(MainActivity.NEWS_LISTEN);

		// 使用广播,所以INTENT必须用getBroadcast方法
		PendingIntent pendingIntent2 = PendingIntent.getBroadcast(
				MainActivity.this, 1, intent2,
				PendingIntent.FLAG_UPDATE_CURRENT);

		// 绑定
		remoteViews.setOnClickPendingIntent(R.id.but_form, pendingIntent2);

		Notification.Builder builderMain = new Notification.Builder(
				MainActivity.this);

		builderMain
				.setContent(remoteViews)
				.setSmallIcon(R.drawable.icon)
				.setLargeIcon(
						BitmapFactory.decodeResource(this.getResources(),
								R.drawable.open)).setOngoing(true)
				.setTicker("music is playing");
		notificationManager.notify(0, builderMain.build());
	}

	// 广播接收器(自定义Notification使用到)
	BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

		@Override
		public void onReceive(Context c, Intent intent) {

			if (intent.getAction().equals(NEWS_LISTEN)) {

				remoteViewsText = "已点击";
				MyNotification();

			}
		}
	};
}

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"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:id="@+id/but"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="notification one" />

    <Button
        android:id="@+id/but2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="notification two" />

    <Button
        android:id="@+id/but3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="notification three" />

    <Button
        android:id="@+id/but4"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="notification four" />

    <Button
        android:id="@+id/but5"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="notification five" />

    <Button
        android:id="@+id/but6"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="notification six" />

</LinearLayout>

form.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" >

    <Button
        android:id="@+id/but_form"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="嘻嘻" />

    <TextView
        android:id="@+id/tv_form"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="无"/>

</LinearLayout>

SecondActivity.java 只是一个activity。

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

Android开发之使用Notification.Builder的相关文章

Android开发之通知栏Notification详解

Notification的用法  --- 状态栏通知 发送一个状态栏通知必须的两个类: 1. NotificationManager   --- 状态栏通知的管理类,负责发通知,清除通知等 NotificationManager : 是一个系统Service,必须通过 context.getSystemService(NOTIFICATION_SERVICE)方法获取 NotificationManager notificationManager = (NotificationManager)

Android开发手记(23) Notification

有时候,我们需要应用程序在状态内显示一些通知信息,这时我们就需要使用Notification来完成这一工作.也许我们会想到以前经常使用的Toast来通知用户.虽然Notification与Toast都可以起到通知.提醒的作用,其实这两者还是有很大不同的.在android中,Notification是通过NotificationManager进行统一管理的,而Toast使用Toast.makeToast即可显示.另外,Notification可以长久的显示在系统的状态栏内,但是Toast只能暂时显

Builder模式详解及其在Android开发中的应用

一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比如说在一些常用的第三方库中也随处可见其踪迹,比如说一些常用的网络请求库如OkHttp或者是retrofit,又或者是图片加载库Glide中也不缺乏它的应用. 为什么Builder模式在Android或是Java开发中这么火呢?因为它相较于构造函数或者是Get/Set方法,它的灵活性和封装性上都比较有

Android开发系列(二十四):Notification的功能与用法

关于消息的提示有两种:一种是Toast,一种就是Notification.前者维持的时间比较短暂,后者维持的时间比较长. 而且我们平常手机的应用比如网易.贴吧等等都有很多的推送消息,就是用Notification实现的. Notification是显示在手机状态栏的通知-手机状态栏位于手机屏幕的上方.程序一般通过NotificationManager服务来发送Notification通知 Notification的一些方法,接下来我们都能够用到: setDefaults():设置通知LED等.音

Android开发学习之路--Notification之初体验

一般当我们收到短信啊,微信啊,或者有些app的提醒.我们都会在通知栏收到一天简单的消息,然后点击消息进入到app里面,事实上android中有专门的Notification的类能够完毕这个工作,这里就实现下这个功能. 首先新建NotificationTestproject,然后加入一个button,用来触发通知.然后编写代码例如以下: package com.example.jared.notificationtest; import android.app.NotificationManage

Android开发系列(二十四):Notification的功能与使用方法

关于消息的提示有两种:一种是Toast,一种就是Notification.前者维持的时间比較短暂,后者维持的时间比較长. 并且我们寻常手机的应用比方网易.贴吧等等都有非常多的推送消息.就是用Notification实现的. Notification是显示在手机状态栏的通知-手机状态栏位于手机屏幕的上方.程序一般通过NotificationManager服务来发送Notification通知 Notification的一些方法.接下来我们都可以用到: setDefaults():设置通知LED等.

Android开发:利用AlarmManager不间断向服务器发送请求以及notification通知

一.前言 嗯,其实需求很简单,但是因为服务器不会主动联系客户端,所以客户端必须不间断的向服务器请求以便得到一些数据,突然不知道怎么描述这个问题了,总之,我是通过AlarmManager来实现客户端不断地向服务器发送请求,好吧,往下. 二.实现 客户端不断的发请求,然后通过获得的响应做一些处理就可以了,流程就简简单单的像下面这个图. 第一步:利用AlarmManager开启轮询服务 public class MyAlarmManager { //开启轮询服务 public static void

Android 开发技巧总结(二)

1.首选项的存取数据 写一个类,里面放入存取方法,然后在外面进行调用 public class PrefsUtils { private static final String PREFS_NAME="com.yomoto.util.OtherPrefs"; //这里放入的名字存入的地址是:data/data/项目包名/shared_prefs/PREFS_NAME //得到首选项中的数据 public static String getValue(Context context,St

Android开发笔记(一百零四)消息推送SDK

推送的集成 常用概念 推送:从服务器把消息实时发到客户端app上,这就是推送,推送可用于发送系统通知.发送推荐信息.发送聊天消息等等. 别名:用于给移动设备取个好记的名字,比如电脑有计算机名,可以把别名理解为开发者给移送设备起的外号.不过,多个移动设备可以起一样的别名,这几个设备就会同时收到发给该别名的消息. 标记:用于给移动设备打标签,可以理解为分类,比如超市里的泰国大米既可以打上"粮食制品"的标签,也可以打上"进口商品"的标签.服务器可以统一给某个种类的移动设备