• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Android--关照之Notification

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/1011/675.html

媒介
 
  以前常州平台运营一篇博客讲了Android下应用Toast的方法提醒消息。这篇博客疏解一下在Android中应用Notification提醒消息给用户,Notification是一种具备全局结果的关照,程序普通通过NotificationManager服无来发送Notification。在本篇博客中,将说明Notification的通例应用,以及自定义方法的应用,对于每种差别的方法,都提供示例展现结果。
 
 
 
Notification
 
  Notification,俗称关照,是一种具备全局结果的关照,它展现在屏幕的顶端,开始会阐扬为一个图标的形式,当用户向下滑动的时候,展现出关照具体的内容。
 
  由于Android的疾速发展,而Android的版本也疾速的晋级造成了少许兼容性的题目。对于Notification而言,Android3.0是一个分水岭,在其以前构建Notification保举应用NotificationCompate.Builder,它位于android.support.v4.app.NotificationCompat.Builder,是一个Android向下版本的兼容包,而在Android3.0以后,普通保举应用Notification.Builder构建。本博客主要说明的是Android4.x的开发,以是在这里应用Notification.Builder进行疏解演示。
 
  关照普通通过NotificationManager服无发送一个Notification工具来实现关照,NotificationManager是一个紧张的体系级服无,该工具位于运用程序的框架层中,运用程序可以通过它向体系发送全局的关照。应用关照的时候,需求建立一个Notification工具用来承载关照的内容,不过普通不会干脆通过Notification的组织技巧来获得工具,而是应用它的里面类Notification.Builder来实例化一个Builder工具,并配置关照的各项属性,非常后通过Notification.Builder.builder()技巧获得一个Notification工具,当获得这个Notification工具以后,便应用NotificationManager.notify()技巧发送关照。
 
  NotificationManager类是一个关照经管器类,这个工具是由体系保护的服无,因此单例模式的方法获得,以是普通并不干脆实例化这个工具。在Activity中,可以应用Activity.getSystemService(String)技巧获取NotificationManager工具,Activity.getSystemService(String)技巧可以通过Android体系级服无的句柄,回笼对应的工具。在这里需求回笼NotificationManager,以是干脆传递Context.NOTIFICATION_SERVICE即可。
 
  固然关照中提供了种种属性的配置,不过一个关照工具,有几个属性是必需求配置的,其余的属性均是可选的,必需配置的属性如下:
 
小图标,应用setSamllIcon()技巧配置。
题目,应用setContentTitle()技巧配置。
文本内容,应用setContentText()技巧配置。 
  
 
更新与移除关照
 
  在应用NotificationManager.notify()发送关照的时候,需求传递一个标识符,用于唯一标识这个关照。对于有些场景,并不是无尽的增加新的关照,偶然候需求更新原有关照的信息,这个时候可以重写构建Notification,而应用与以前关照相像标识符来发送关照,这个时候旧的关照就被被新的关照所取代,起到更新关照的结果。
 
  对于一个关照,当展现在状况栏以后,不过应用事后,若何作废呢?Android为我们提供两种方法移除关照,一种是Notification本人保护,应用setAutoCancel()技巧配置是否保护,传递一个boolean范例的数据。另外一种方法应用NotificationManager关照经管器工具来保护,它通过notify()发送关照的时候,指定的关照标识Id来操纵关照,可以应用cancel(int)来移除一个指定的关照,也能够应用cancelAll()移除所有的关照。
 
  应用NotificationManager移除指定关照示例:
 
1         NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
2         mNotificationManager.cancel(0);
 
 
 PendingIntent
 
  对于一个关照而言,它显示的消息是有限的,普通仅用于提醒少许提要信息。不过普通简略的消息,并不行表白需求告诉用户的一切内容,以是需求绑定一个意图,当用户点击关照的时候,挪用一个意图展现出一个Activity用来显示详细的内容。而Notification中,并不应用通例的Intent去传递一个意图,而是应用PendingIntent。
 
  先来说说常州微信公众平台Intent和PendingIntent的差别,PendingIntent可以看做是对Intent的包装,通过称号可以看出PendingIntent用于处分即将产生的意图,而Intent用来用来处分即刻产生的意图。而对于关照来说,它是一体系级的全局关照,并不确定这个意图被执行的时间。当在运用外部执行PendingIntent时,由于它留存了触发运用的Context,使得外部运用可以如在目前运用中同样,执行PendingIntent里的Intent,就算执行的时候相应关照的运用曾经被销毁了,也能够通过存在PendingIntent里的Context照常执行它,而且还可以处分Intent说带来的分外信息。
 
  PendingIntent提供了多个静态的getXxx()技巧,用于获得适合于差别场景的PendingIntent工具。普通需求传递的几个参数都很通例,只说明一个flag参数,用于标识PendingIntent的组织选定:
 
FLAG_CANCEL_CURRENT:要是构建的PendingIntent曾经存在,则作废前一个,从新构建一个。
FLAG_NO_CREATE:要是前一个PendingIntent曾经不存在了,将不再构建它。
FLAG_ONE_SHOT:表明这里构建的PendingIntent只能应用一次。
FLAG_UPDATE_CURRENT:要是构建的PendingIntent曾经存在,则替代它,常用。
 
 
Notification视觉样式
 
  Notification有两种视觉样式,一种是尺度视图(Normal view)、一种是大视图(Big view)。尺度视图在Android中各版本是通用的,不过对于大视图而言,仅支持Android4.1+的版本。
 
  从官方文档打听到,一个尺度视图显示的大小要保持在64dp高,宽度为屏幕尺度。尺度视图的关照主体内容有一下几个:
 
 
 
关照题目。
大图标。
关照内容。
关照消息。
小图标。
关照的时间,普通为体系时间,也能够应用setWhen()配置。
  下面通过一个示例,模仿上头结果的关照。
 
复制代码
复制代码
 1 btnNotification.setOnClickListener(new View.OnClickListener() {
 2 
 3             @Override
 4             public void onClick(View v) {
 5                 Bitmap btm = BitmapFactory.decodeResource(getResources(),
 6                         R.drawable.msg);
 7                 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
 8                         MainActivity.this).setSmallIcon(R.drawable.msg)
 9                         .setContentTitle("5 new message")
10                         .setContentText("twain@android.com");
11                 mBuilder.setTicker("New message");//第一次提醒消息的时候显示在关照栏上
12                 mBuilder.setNumber(12);
13                 mBuilder.setLargeIcon(btm);
14                 mBuilder.setAutoCancel(true);//本人保护关照的消散
15                 
16                 //构建一个Intent
17                 Intent resultIntent = new Intent(MainActivity.this,
18                         ResultActivity.class);
19                 //封装一个Intent
20                 PendingIntent resultPendingIntent = PendingIntent.getActivity(
21                         MainActivity.this, 0, resultIntent,
22                         PendingIntent.FLAG_UPDATE_CURRENT);
23                 // 配置关照主题的意图
24                 mBuilder.setContentIntent(resultPendingIntent);
25                 //获取关照经管器工具
26                 NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
27                 mNotificationManager.notify(0, mBuilder.build());
28             }
29         });
复制代码
复制代码
  显示结果:
 
 
 
 
 
  而对于大视图(Big View)而言,它的细节区域只能显示256dp高度的内容,而且只对Android4.1+以后的建筑才支持,它比尺度视图差别样的地方,均需求应用setStyle()技巧设定,它大抵的结果如下:
 
 
  setStyle()传递一个NotificationCompat.Style工具,它是一个空洞类,Android为我们提供了三个实现类,用于显示差别的场景。分别是:
 
NotificationCompat.BigPictureStyle, 在细节片面显示一个256dp高度的位图。
NotificationCompat.BigTextStyle,在细节片面显示一个大的文本块。
NotificationCompat.InboxStyle,在细节片面显示一段行文本。
  要是仅仅显示一个图片,应用BigPictureStyle是非常利便的;要是需求显示一个富文本信息,则可以应用BigTextStyle;要是仅仅用于显示一个文本的信息,辣么应用InboxStyle即可。背面会以一个示例来展现InboxStyle的应用,模仿上头图片的显示。
 
   实现代码:
 
复制代码
复制代码
 1         btnBigViewNotification.setOnClickListener(new View.OnClickListener() {
 2 
 3             @Override
 4             public void onClick(View v) {
 5 
 6                 Bitmap btm = BitmapFactory.decodeResource(getResources(),
 7                         R.drawable.msg);
 8                 Intent intent = new Intent(MainActivity.this,
 9                         ResultActivity.class);
10 
11                 PendingIntent pendingIntent = PendingIntent.getActivity(
12                         MainActivity.this, 0, intent,
13                         PendingIntent.FLAG_CANCEL_CURRENT);
14 
15                 Notification noti = new NotificationCompat.Builder(
16                         MainActivity.this)
17                         .setSmallIcon(R.drawable.msg)
18                         .setLargeIcon(btm)
19                         .setNumber(13)
20                         .setContentIntent(pendingIntent)
21                         .setStyle(
22                                 new NotificationCompat.InboxStyle()
23                                         .addLine(
24                                                 "M.Twain (Google+) Haiku is more than a cert...")
25                                         .addLine("M.Twain Reminder")
26                                         .addLine("M.Twain Lunch?")
27                                         .addLine("M.Twain Revised Specs")
28                                         .addLine("M.Twain ")
29                                         .addLine(
30                                                 "Google Play Celebrate 25 billion apps with Goo..")
31                                         .addLine(
32                                                 "Stack Exchange StackOverflow weekly Newsl...")
33                                         .setBigContentTitle("6 new message")
34                                         .setSu毫米aryText("mtwain@android.com"))
35                         .build();
36 
37                 NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
38                 mNotificationManager.notify(0, noti);
39             }
40         });
复制代码
复制代码
  展现结果:
 
 
 
 
 
进度条样式的关照
 
  对于常州微信小程序开发一个尺度关照,偶然候显示的消息并不必然是静态的,还可以设定一个进度条用于显示事件实现的进度。
 
  Notification.Builder类中提供一个setProgress(int max,int progress,boolean indeterminate)技巧用于配置进度条,max用于设定进度的非常大数,progress用于设定目前的进度,indeterminate用于设定是否是一个确定进度的进度条。通过indeterminate的配置,可以实现两种差别样式的进度条,一种是有进度刻度的(true),一种是轮回活动的(false)。下面分别用两个示例演示:
 
  有进度的进度条,实现代码: 
 
复制代码
复制代码
 1         btnProgreNotification.setOnClickListener(new View.OnClickListener() {
 2             @Override
 3             public void onClick(View v) {
 4                 manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 5                 builder = new NotificationCompat.Builder(MainActivity.this)
 6                         .setSmallIcon(R.drawable.ic_launcher)
 7                         .setContentTitle("Picture Download")
 8                         .setContentText("Download in progress");
 9                 builder.setAutoCancel(true);
10                 //通过一个子线程,动静增加进度条刻度
11                 new Thread(new Runnable() {
12                     @Override
13                     public void run() {
14                         int incr;
15                         for (incr = 0; incr <= 100; incr += 5) {
16                             builder.setProgress(100, incr, false);
17                             manager.notify(0, builder.build());
18                             try {
19                                 Thread.sleep(300);
20                             } catch (InterruptedException e) {
21                                 Log.i(TAG, "sleep failure");
22                             }
23                         }
24                         builder.setContentText("Download complete")
25                                 .setProgress(0, 0, false);
26                         manager.notify(0, builder.build());
27                     }
28                 }).start();
29             }
30         });
复制代码
复制代码
  显示结果:
 
 
 
   对于轮回活动的进度条,下面是实现代码:
 
复制代码
复制代码
 1         btnProNotification.setOnClickListener(new View.OnClickListener() {
 2             @Override
 3             public void onClick(View v) {
 4                 manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 5                 builder = new NotificationCompat.Builder(MainActivity.this)
 6                         .setSmallIcon(R.drawable.ic_launcher)
 7                         .setContentTitle("Picture Download")
 8                         .setContentText("Download in progress");
 9                 builder.setProgress(0, 0, true);//配置为true,表示活动
10                 manager.notify(0, builder.build());
11 
12                 //5秒以后还休止活动
13                 new Thread(new Runnable() {
14                     @Override
15                     public void run() {
16                         try {
17                             Thread.sleep(5000);
18                         } catch (InterruptedException e) {
19                             e.printStackTrace();
20                         }
21                         builder.setProgress(100, 100, false);//配置为true,表示刻度
22                         manager.notify(0, builder.build());
23                     }
24                 }).start();
25             }
26         });
复制代码
复制代码
  结果展现:
 
 
 
 
 
自定义关照
 
  和Toast同样,关照也能够应用自定义的XML来自定义样式,不过对于关照而言,由于它的全局性,并不行简单的通过inflate伸展出一个View,由于可能触发关照的时候,相应的App曾经关闭,无法获取当指定的XML结构文件。以是需求应用独自的一个RemoteViews类来操纵。
 
  RemoteViews,形貌了一个视图档次的结构,可以显示在另一个历程。档次结构也是从结构文件中“伸展”出一个视图,这个类,提供了少许根基的操纵求改其伸展的内容。
 
  RemoteViews提供了多个组织函数,普通应用RemoteViews(String packageName,int layoutId)。第一个参数为包的称号,第二个为layout资源的Id。当获取到RemoteViews工具以后,可以应用它的一系列setXxx()技巧通过控件的Id配置控件的属性。非常后应用NotificationCompat.Builder.setContent(RemoteViews)技巧配置它到一个Notification中。
 
  下面通过一个示例展现它:
 
  自定义的结构XML代码:
 
复制代码
复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:padding="10dp" >
 6 
 7     <ImageView
 8         android:id="@+id/imageNo"
 9         android:layout_width="wrap_content"
10         android:layout_height="match_parent"
11         android:layout_alignParentLeft="true"
12         android:layout_marginRight="10dp" />
13 
14     <TextView
15         android:id="@+id/titleNo"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:layout_toRightOf="@id/imageNo" />
19 
20     <TextView
21         android:id="@+id/textNo"
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:layout_below="@id/titleNo"
25         android:layout_toRightOf="@id/imageNo" />
26 
27 </RelativeLayout>
复制代码
复制代码
  实现代码:
 
复制代码
复制代码
 1         btnCustomNotification.setOnClickListener(new View.OnClickListener() {
 2             @Override
 3             public void onClick(View v) {
 4                 RemoteViews contentViews = new RemoteViews(getPackageName(),
 5                         R.layout.custom_notification);
 6                 //通过控件的Id配置属性
 7                 contentViews
 8                         .setImageViewResource(R.id.imageNo, R.drawable.btm1);
 9                 contentViews.setTextViewText(R.id.titleNo, "自定义关照题目");
10                 contentViews.setTextViewText(R.id.textNo, "自定义关照内容");
11 
12                 Intent intent = new Intent(MainActivity.this,
13                         ResultActivity.class);
14 
15                 PendingIntent pendingIntent = PendingIntent.getActivity(
16                         MainActivity.this, 0, intent,
17                         PendingIntent.FLAG_CANCEL_CURRENT);
18                 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
19                         MainActivity.this).setSmallIcon(R.drawable.ic_launcher)
20                         .setContentTitle("My notification")
21                         .setTicker("new message");
22                 mBuilder.setAutoCancel(true);
23 
24                 mBuilder.setContentIntent(pendingIntent);
25                 mBuilder.setContent(contentViews);
26                 mBuilder.setAutoCancel(true);
27                 NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
28                 mNotificationManager.notify(10, mBuilder.build());
29             }
30         });
复制代码
复制代码
  结果展现:
 
 
 
 
 
设定常州网站开发建设提醒相应
 
  对于有些关照,需求挪用少许建筑的资源,应用户能更快的发现有新关照,普通可设定的相应有:铃声、闪光灯、触动。对于这三个属性,NotificationCompat.Builder提供了三个技巧设定:
 
setSound(Uri sound):设定一个铃声,用于在关照的时候相应。传递一个Uri的参数,花样为“file:///mnt/sdcard/Xxx.mp3”。
setLights(int argb, int onMs, int offMs):设定前置LED灯的闪灼速度,连接毫秒数,停顿毫秒数。
setVibrate(long[] pattern):设定触动的模式,以一个long数组留存毫秒级隔断的触动。
  大无数时候,我们并不需求设定一个特定的相应结果,只需求遵循用户建筑上体系关照的结果即可,辣么可以应用setDefaults(int)技巧设定默认相应参数,在Notification中,对它的参数应用常量定义了,我们只需应用即可:
 
DEFAULT_ALL:铃声、闪光、触动均体系默认。
DEFAULT_SOUND:体系默认铃声。
DEFAULT_VIBRATE:体系默认触动。
DEFAULT_LIGHTS:体系默认闪光。
  而在Android中,要是需求走访硬件建筑的话,是需求对其进行授权的,以是需求在清单文件AndroidManifest.xml中增加两个授权,分别付与走访振动器与闪光灯的权限:
 
1     <!-- 闪光灯权限 -->
2     <uses-permission android:name="android.permission.FLASHLIGHT"/>
3     <!-- 振动器权限 -->
4     <uses-permission android:name="android.permission.VIBRATE"/>
 
 
  由于只是一个属性的设定,而且大片面时候,应用体系设定即可,这里就不提供代码示例了。 
 
 
 

上篇:上一篇:Android PopupWindow完成从顶部弹出下拉菜单
下篇:下一篇:Android之 Fragment 的使用