java notification_Notification详解(含工具类)

packagecom.kale.notification;importandroid.app.Activity;importandroid.app.Notification;importandroid.app.NotificationManager;importandroid.app.PendingIntent;importandroid.content.Context;importandroid.content.Intent;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.os.SystemClock;importandroid.support.v4.app.NotificationCompat;importandroid.widget.RemoteViews;public classNotificationAdmain {private static intNOTIFICATION_ID;privateNotificationManager nm;privateNotification notification;privateNotificationCompat.Builder cBuilder;privateNotification.Builder nBuilder;privateContext mContext;int requestCode = (int) SystemClock.uptimeMillis();private static final int FLAG =Notification.FLAG_INSISTENT;public NotificationAdmain(Context context, intID) {this.NOTIFICATION_ID =ID;

mContext=context;//获取系统服务来初始化对象

nm =(NotificationManager) mContext

.getSystemService(Activity.NOTIFICATION_SERVICE);

cBuilder= newNotificationCompat.Builder(mContext);

}/*** 设置在顶部通知栏中的各种信息

*

*@paramintent

*@paramsmallIcon

*@paramticker*/

private void setCompatBuilder(Intent intent, intsmallIcon, String ticker,

String title, String msg) {//如果当前Activity启动在前台,则不开启新的Activity。

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//当设置下面PendingIntent.FLAG_UPDATE_CURRENT这个参数的时候,常常使得点击通知栏没效果,你需要给notification设置一个独一无二的requestCode//将Intent封装进PendingIntent中,点击通知的消息后,就会启动对应的程序

PendingIntent pIntent =PendingIntent.getActivity(mContext,

requestCode, intent, FLAG);

cBuilder.setContentIntent(pIntent);//该通知要启动的Intent

cBuilder.setSmallIcon(smallIcon);//设置顶部状态栏的小图标

cBuilder.setTicker(ticker);//在顶部状态栏中的提示信息

cBuilder.setContentTitle(title);//设置通知中心的标题

cBuilder.setContentText(msg);//设置通知中心中的内容

cBuilder.setWhen(System.currentTimeMillis());/** 将AutoCancel设为true后,当你点击通知栏的notification后,它会自动被取消消失,

* 不设置的话点击消息后也不清除,但可以滑动删除*/cBuilder.setAutoCancel(true);//将Ongoing设为true 那么notification将不能滑动删除//notifyBuilder.setOngoing(true);

/** 从Android4.1开始,可以通过以下方法,设置notification的优先级,

* 优先级越高的,通知排的越靠前,优先级低的,不会在手机最顶部的状态栏显示图标*/cBuilder.setPriority(NotificationCompat.PRIORITY_MAX);/** Notification.DEFAULT_ALL:铃声、闪光、震动均系统默认。

* Notification.DEFAULT_SOUND:系统默认铃声。

* Notification.DEFAULT_VIBRATE:系统默认震动。

* Notification.DEFAULT_LIGHTS:系统默认闪光。

* notifyBuilder.setDefaults(Notification.DEFAULT_ALL);*/cBuilder.setDefaults(Notification.DEFAULT_ALL);

}/*** 设置builder的信息,在用大文本时会用到这个

*

*@paramintent

*@paramsmallIcon

*@paramticker*/

private void setBuilder(Intent intent, intsmallIcon, String ticker) {

nBuilder= newNotification.Builder(mContext);//如果当前Activity启动在前台,则不开启新的Activity。

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

PendingIntent pIntent=PendingIntent.getActivity(mContext,

requestCode, intent, FLAG);

nBuilder.setContentIntent(pIntent);

nBuilder.setSmallIcon(smallIcon);

nBuilder.setTicker(ticker);

nBuilder.setWhen(System.currentTimeMillis());

nBuilder.setPriority(NotificationCompat.PRIORITY_MAX);

nBuilder.setDefaults(Notification.DEFAULT_ALL);

}/*** 普通的通知

*

*@paramintent

*@paramsmallIcon

*@paramticker

*@paramtitle

*@parammsg*/

public void normal_notification(Intent intent, intsmallIcon,

String ticker, String title, String msg) {

setCompatBuilder(intent, smallIcon, ticker, title, msg);

sent();

}/*** 进行多项设置的通知(在小米上似乎不能设置大图标,系统默认大图标为应用图标)

*

*@paramintent

*@paramsmallIcon

*@paramticker

*@paramLargeIcon

*@paramtitle

*@parammsg*/

public void special_notification(Intent intent, intsmallIcon,

String ticker,intLargeIcon, String title, String msg) {

setCompatBuilder(intent, smallIcon, ticker, title, msg);//如果不设置LargeIcon,那么系统会默认将上面的SmallIcon作为主要图标,显示在通知选项的最左侧,右下角的小图标将不再显示

Bitmap bitmap =BitmapFactory.decodeResource(mContext.getResources(),

LargeIcon);

cBuilder.setLargeIcon(bitmap);//将Ongoing设为true 那么notification将不能滑动删除

cBuilder.setOngoing(true);//删除时

Intent deleteIntent = new Intent(mContext, DeleteService.class);int deleteCode = (int) SystemClock.uptimeMillis();//删除时开启一个服务

PendingIntent deletePendingIntent =PendingIntent.getService(mContext,

deleteCode, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT);

cBuilder.setDeleteIntent(deletePendingIntent);

cBuilder.setDefaults(Notification.DEFAULT_SOUND| //设置使用默认的声音

Notification.DEFAULT_LIGHTS);//设置使用默认的LED

cBuilder.setVibrate(new long[] { 0, 100, 200, 300 });//设置自定义的振动

cBuilder.setAutoCancel(true);//builder.setSound(Uri.parse("file:///sdcard/click.mp3"));//设置通知样式为收件箱样式,在通知中心中两指往外拉动,就能出线更多内容,但是很少见

cBuilder.setNumber(3);

cBuilder.setStyle(newNotificationCompat.InboxStyle()

.addLine("M.Lynn 你好,我是kale").addLine("M.Lynn 已收到,保证完成任务")

.addLine("M.Lynn 哈哈,明白了~").setSummaryText("+3 more")); //设置在细节区域底端添加一行文本

sent();

}/*** 自定义视图的通知

*

*@paramremoteViews

*@paramintent

*@paramsmallIcon

*@paramticker*/

public voidview_notification(RemoteViews remoteViews, Intent intent,intsmallIcon, String ticker) {

setCompatBuilder(intent, smallIcon, ticker,null, null);

notification=cBuilder.build();

notification.contentView=remoteViews;//发送该通知

nm.notify(NOTIFICATION_ID, notification);

}/*** 可以容纳多行提示文本的通知信息 (因为在高版本的系统中才支持,所以要进行判断)

*

*@paramintent

*@paramsmallIcon

*@paramticker

*@paramtitle

*@parammsg*/

public void big_notification(Intent intent, intsmallIcon, String ticker,

String title, String msg) {final int sdk =android.os.Build.VERSION.SDK_INT;if (sdk

normal_notification(intent, smallIcon, ticker, title, msg);

}else{

setBuilder(intent, smallIcon, ticker);

nBuilder.setContentTitle(title);

nBuilder.setPriority(Notification.PRIORITY_HIGH);

notification= newNotification.BigTextStyle(nBuilder).bigText(msg)

.build();//发送该通知

nm.notify(NOTIFICATION_ID, notification);

}

}/*** 有进度条的通知,可以设置为模糊进度或者精确进度

*

*@paramintent

*@paramsmallIcon

*@paramticker

*@paramtitle

*@parammsg*/

public void progress_notification(Intent intent, intsmallIcon,

String ticker, String title, String msg) {

setCompatBuilder(intent, smallIcon, ticker, title, msg);/** 因为进度条要实时更新通知栏也就说要不断的发送新的提示,所以这里不建议开启通知声音。

* 这里是作为范例,给大家讲解下原理。所以发送通知后会听到多次的通知声音。*/

new Thread(newRunnable() {

@Overridepublic voidrun() {intincr;for (incr = 0; incr <= 100; incr += 10) {//参数:1.最大进度, 2.当前进度, 3.是否有准确的进度显示

cBuilder.setProgress(100, incr, false);//cBuilder.setProgress(0, 0, true);

sent();try{

Thread.sleep(1 * 500);

}catch(InterruptedException e) {

e.printStackTrace();

}

}//进度满了后,设置提示信息

cBuilder.setContentText("下载完成~").setProgress(0, 0, false);

sent();

}

}).start();

}/*** 容纳大图片的通知

*

*@paramintent

*@paramsmallIcon

*@paramticker

*@paramtitle

*@parambigPic*/

public void pic_notification(Intent intent, intsmallIcon, String ticker,

String title,intbigPic) {

setCompatBuilder(intent, smallIcon, ticker, title,null);

NotificationCompat.BigPictureStyle picStyle= newNotificationCompat.BigPictureStyle();

Bitmap bitmap=BitmapFactory.decodeResource(mContext.getResources(),

bigPic);

picStyle.bigPicture(bitmap);

cBuilder.setStyle(picStyle);

sent();

}/*** 里面有两个按钮的通知

*

*@paramintent

*@paramsmallIcon

*@paramticker

*@paramtitle

*@parammsg*/

public void btn_notification(Intent intent, intsmallIcon, String ticker,

String title, String msg) {

Intent notifyIntent= new Intent(mContext, OtherActivity.class);int requestCode = (int) SystemClock.uptimeMillis();

PendingIntent pendIntent=PendingIntent.getActivity(mContext,

requestCode, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);

setCompatBuilder(intent, smallIcon, ticker, title, msg);

cBuilder.addAction(android.R.drawable.ic_media_previous,

mContext.getString(R.string.previous), pendIntent);

cBuilder.addAction(android.R.drawable.ic_media_next,

mContext.getString(R.string.next), pendIntent);

sent();

}/*** 发送通知*/

private voidsent() {

notification=cBuilder.build();//发送该通知

nm.notify(NOTIFICATION_ID, notification);

}/*** 根据id清除通知*/

public voidclear() {//取消通知

nm.cancelAll();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值