Android之Notification抽屉通知详解

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

//学习本章内容你要知道的知识两个重要知识点内容!

1.自定义通知不显示的问题
解决方法:
(1)忘写了notify()通知方法
(2)请设置icon小图标

2.如果API是16请将getNotification()换成build()
2.PendingIntent有一个getActivity方法


PendingIntent有一个getActivity方法,第一个参数是上下文,第二个参数 requestCode,第三个参数是 Intent,用来存储信息,第四个参数是对参数的操作标识,常用的就是FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT。
当使用FLAG_UPDATE_CURRENT时:
PendingIntent.getActivity(context, 0, notificationIntent,PendingIntent.FLAG_CANCEL_CURRENT时);

FLAG_UPDATE_CURRENT会更新之前PendingIntent的消息,比如,你推送了消息1,并在其中的Intent中putExtra了一个值“ABC”,在未点击该消息前,继续推送第二条消息,并在其中的Intent中putExtra了一个值“CBA”,好了,这时候,如果你单击消息1或者消息2,你会发现,他俩个的Intent中读取过来的信息都是“CBA”,就是说,第二个替换了第一个的内容

当使用FLAG_CANCEL_CURRENT时:

依然是上面的操作步骤,这时候会发现,点击消息1时,没反应,第二条可以点击。

导致上面两个问题的原因就在于第二个参数requestCode,当requestCode值一样时,后面的就会对之前的消息起作用,所以为了避免影响之前的消息,requestCode每次要设置不同的内容。

直接上源码:
代码很长,但是注释很详细:

package com.example.notifications;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	//发送一个普通视图通知的方法
	public void button1(View v) {
		//
		Notification.Builder Builder=new Notification.Builder(this);
		//设置一个小图标
		Builder.setSmallIcon(R.drawable.ic_launcher);
		//设置标题
		Builder.setContentTitle("我是一个普通通知抽屉");
		//设置内容信息
		Builder.setContentInfo("点击我可以打开一个新的界面");
		//设置常驻通知,注意常驻通知和自动清除最好不要一起用
	//	Builder.setOngoing(true);
		//设置点击通知后自动清除
		Builder.setAutoCancel(true);
		/*
		 * 设置通知的声音+震动+呼吸灯,注意!!!设置这个值要增加系统震动的权限,
		 * <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
		 * 否则模拟器就会程序异常退出
		 */
		Builder.setDefaults(Notification.DEFAULT_ALL);
		//设置通知到了第几条消息
		Builder.setNumber(10);
		//设置通知抽屉还没有下拉时通知的文字
		Builder.setTicker("新消息");
		
		/*
		 *	 给抽屉通知设置一个点击事件
		 *	定义一个意图,当打开一个通知时要打开一个界面(Activity);
		 *	getActivities的参数:
		 *  参数1(上下文)参数二(通知请求码),参数三(封装好的Intent对象)参数四(一个标记)
		 *  通过getActivities打开一个Activity
		 */
		Intent intent=new Intent(this,open_Activity.class);
		PendingIntent pi=PendingIntent.getActivity(this,1,intent,PendingIntent.FLAG_UPDATE_CURRENT);
		Builder.setContentIntent(pi);//参数pi是一个pendingIntent意图对象
		
		//开始把设置好的消息构建为一个通知对象
		Notification n=Builder.build();
		//获取系统的通知管理器,通过系统的管理器发送消息
		NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		
		//发送通知,参数(一个通知的编号,要发送的通知对象)
		nm.notify(1,n);
	}

	//发送一个大视图通知的方法
	@SuppressLint("NewApi")
	public void button2(View v) {
		Notification.Builder Builder=new Notification.Builder(this);
		//设置一个小图标
		Builder.setSmallIcon(R.drawable.ic_launcher);
		//设置标题
		Builder.setContentTitle("我是一个大视图通知抽屉");
		//设置内容信息
		Builder.setContentInfo("欢迎使用通知抽屉");
		
		
		//设置大视图的样式!!!
		Notification.InboxStyle style=new Notification.InboxStyle();
		//设置大视图内容的标题
		style.setBigContentTitle("蒲公英妈妈");
		//设置注解
		style.setSummaryText("作者:文龙");
		//设置每一行的文本
		style.addLine("蒲公英妈妈给自己的孩子准备了降落伞");
		style.addLine("只要风儿轻轻吹过");
		style.addLine("孩子就随风儿飘走");
		
		//把定义好的style设置给通知
		Builder.setStyle(style);
		
		Notification nf =Builder.build();
		
	    NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
	    nm.notify(2,nf);
	}
	
	//发送一个进度条视图通知的方法
		public void button3(View v) {
			final Notification.Builder Builder=new Notification.Builder(this);
			//设置一个小图标
			Builder.setSmallIcon(R.drawable.ic_launcher);
			//设置标题
			Builder.setContentTitle("我是一个进度条通知");
			//设置内容信息
			Builder.setContentInfo("模拟下载");
			
		    //构建发送通知的管理器
			final NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		    
		    
		    //模拟下载的线程
		    new Thread(new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					for(int prograss=0;prograss<=100;prograss+=5) {
						//参数(最大进度,当前进度,是否为不确定的进度)
						Builder.setProgress(100,prograss,false);
						//每次跟新完成进度都要发送通知
						nm.notify(3,Builder.build());
						
						//每加5都要休眠500毫秒
						try {
							Thread.sleep(500);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						
					}
					//下载完成之后:
					Builder.setProgress(0,0, false);
					Builder.setContentText("模拟下载完成!!!");
					
					nm.notify(3, Builder.build());
					//最后千万不要忘了!!!!!!!线程start()
				}
			}).start();;
		}
		
		
		//发送一个自定义视图通知的方法
		public void button4(View v) {
			Notification.Builder Builder=new Notification.Builder(this);
			
			//!!!!切记如果不设置一个小图标,自定义通知是显示不出来的
			
			//设置一个小图标
			Builder.setSmallIcon(R.drawable.ic_launcher);
			/*
			 * RemoteViews(中文意思标识     远程 意见)
			 * 创建一个远程的视图      参数1(自定义Layout视图布局文件所在包名,自定义视图Layout布局文件的id)
			 */
			RemoteViews views=new RemoteViews(getPackageName(),R.layout.notice_layout);
			
			//通过这个方法可以通过一个TextView的id或者Button的id给它们设置文本
			views.setTextViewText(R.id.tv1,"沧海笑");
			
			//这个方法可以给按钮设置点击事件,不过具体的用法我还不知道,现在把他给注释掉
	//		views.setOnClickPendingIntent(viewId, pendingIntent);
			
			
			
			//把远程视图通过setContent方法设置到通知里去
			Builder.setContent(views);
			
			Builder.setTicker("我自定义了一个通知(文龙播放器)");
			
			//通过,通知管理器发送通知
			NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
			nm.notify(4, Builder.build());
			Toast.makeText(getApplicationContext(), "hello",1000).show();
		}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王家视频教程图书馆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值