1.默认用法
一个 Notification 的必要属性有三项,如果不设置则在运行时会抛出异常:小图标,通过 setSmallIcon() 方法设置
标题,通过 setContentTitle() 方法设置
内容,通过 setContentText() 方法设置
下面,我们就来创建一个简单的 Notification 。主要有以下三步:
获取 NotificationManager 实例
实例化 NotificationCompat.Builder 并设置相关属性
通过 builder.build() 方法生成 Notification 对象,并发送通知
mBuilder.setContentTitle("测试标题")//设置通知栏标题
.setContentText("测试内容") //设置通知栏显示内容
.setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //设置通知栏点击意图
// .setNumber(number) //设置通知集合的数量
.setTicker("测试通知来啦") //通知首次出现在通知栏,带上升动画效果的
.setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间
.setPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级
// .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消
.setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)
或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前
默认设置,使用defaults属性,可以组合
//Notification.DEFAULT_ALL
Notification.DEFAULT_SOUND 添加声音 // requires VIBRATE permission
.setSmallIcon(R.drawable.ic_launcher);//设置通知小ICON
2.自定义通知RemoteViews,使用自定义布局
RemoteViews表示的是一个View结构,它可以在其他进程中(系统的SystemServer进程)显示,为了能够更新它的界面,RemoteViews提供了一组基础操作用于跨进程更新。
// 创建 Notification.Builder 对象
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getContext());
RemoteViews contentview = new RemoteViews(getContext().getPackageName(), R.layout.notificationview);
contentview.setImageViewResource(R.id.iv_content, R.drawable.tu1);
contentview.setTextViewText(R.id.tv_content, "你收到一条新信息");
contentview.setTextViewText(R.id.tv_number, "2");
SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm:ss");
Date date=new Date(System.currentTimeMillis());
String time=dateFormat.format(date);
contentview.setTextViewText(R.id.tv_when,time);
int requestcode = (int) System.currentTimeMillis() / 1000;
Intent intentclose=new Intent("com.example.k555l.testtwo.action.closenotice");//打开广播服务用于清除信息,需要注册
intentclose.putExtra("notice_ID",requestcode);
PendingIntent pendingIntent=PendingIntent.getBroadcast(getContext(),requestcode,intentclose,PendingIntent.FLAG_UPDATE_CURRENT);
contentview.setOnClickPendingIntent(R.id.tv_close,pendingIntent);//设置点击事件
Intent intent = new Intent(getContext(), MainActivity.class);
PendingIntent pendingIntent1 = PendingIntent.getActivity(getContext(), requestcode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(pendingIntent1);//点击通知相应意图
mBuilder.setSmallIcon(R.drawable.tu1);
mBuilder.setAutoCancel(true);//点击通知后自动清除
mBuilder.setPriority(Notification.PRIORITY_DEFAULT);//优先级
mBuilder.setDefaults(Notification.DEFAULT_SOUND);//通知的效果
mBuilder.setContent(contentview);
NotificationManager manager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(requestcode, mBuilder.build());
广播信息处理
public class CloseNotice extends BroadcastReceiver {//要在AndroidManifest注册广播 @Override public void onReceive(Context context, Intent intent) { int id= intent.getIntExtra("notice_ID",-1); if (id!=-1){ NotificationManager manager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); manager.cancel(id);//清除通知 Toast.makeText(context,"close",Toast.LENGTH_LONG).show(); } } }
定义通知呢有一点需要注意就是,这个自定义的布局里的TextView字体的大小和颜色需要合理地配置,不然很容易在不同系统中和其他app的通知展示方式不一样,导致用户通知栏因为这个而显得不美观,甚至很突兀。那么,官方也是有给我们提供这样的解决方案:
Android 5.0之前可用:
android:style/TextAppearance.StatusBar.EventContent.Title // 通知标题样式
android:style/TextAppearance.StatusBar.EventContent // 通知内容样式
Android 5.0及更高版本:
android:style/TextAppearance.Material.Notification.Title // 通知标题样式
android:style/TextAppearance.Material.Notification // 通知内容样式
<LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="wrap_content"> <TextView android:id="@+id/tv_content" android:layout_width="0dp" android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Info" android:layout_weight="1" android:layout_height="wrap_content" android:text="content" android:textSize="18sp" /> <TextView android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Info" android:id="@+id/tv_close" android:textColor="#fe1110" android:layout_gravity="right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="close" android:textSize="18sp" /> </LinearLayout>
关于PendingIntent
PendingIntent可以看做是对Intent的包装,通过名称可以看出PendingIntent用于处理即将发生的意图,而Intent用来用来处理马上发生的意图。而对于通知来说,它是一系统级的全局通知,并不确定这个意图被执行的时间。当在应用外部执行PendingIntent时,因为它保存了触发应用的Context,使得外部应用可以如在当前应用中一样,执行PendingIntent里的Intent,就算执行的时候响应通知的应用已经被销毁了,也可以通过存在PendingIntent里的Context照常执行它,并且还可以处理Intent说带来的额外信息。
PendingInteng.getBroadcast(contex, requestCode, intent, flags)//打开广播
PendingInteng.getService(contex, requestCode, intent, flags)//打开服务
PendingInteng.getActivity(contex, requestCode, intent, flags)//打开activity
PendingInteng.getActivities(contex, requestCode, intent, flags)
其中flags属性参数:
FLAG_ONE_SHOT 表示返回的PendingIntent仅能执行一次,执行完后自动消失
FLAG_NO_CREATE 表示如果描述的PendingIntent不存在,并不创建相应的PendingIntent,而是返回NULL
FLAG_CANCEL_CURRENT 表示相应的PendingIntent已经存在,则取消前者,然后创建新的PendingIntent
FLAG_UPDATE_CURRENT 表示更新的PendingIntent,如果构建的PendingIntent已经存在,则替换它。
移除通知
在使用NotificationManager.notify()发送通知的时候,需要传递一个标识符,用于唯一标识这个通知。
Android为我们提供两种方式移除通知,一种是Notification自己维护,使用setAutoCancel()方法设置是否维护,传递一个boolean类型的数据。另外一种方式使用NotificationManager通知管理器对象来维护,它通过notify()发送通知的时候,指定的通知标识Id来操作通知,可以使用cancel(int)来移除一个指定的通知,也可以使用cancelAll()移除所有的通知。
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(id);