对于通知(Notification)相信没有人陌生,只是不知道指的是什么罢了。Notification是显示在手机状态栏的一种全局效果通知(手机状态栏位于手机屏幕的最上方,用于显示了手机当前的网络状态,电池状态,时间等)。
在Android中Notification的使用也比较方便,Android为它提供了完整的套路,和AlertDialog(提示弹窗)类似,从布局到功能都有具体设定,开发者只需要填入内容和事件即可。
Notification有两种视觉风格:标准视图(Normal view)和大视图(Big view)。标准视图在Android中各版本是通用的,但是对于大视图仅支持Android4.1+的版本。标准视图是一个高度为64dp的通知,大视图是一个细节部分高度为256dp的通知,当然宽度都是充满屏幕宽的。
要想使用Notification首先要获取通知管理器NotificationManager,获取的方法也是固定的
NotificationManagernotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
以标准视图通知为例,同AlertDialog类似的,API16之后建立Notification的时候需要借助其中的内部类Builder为其设置属性,那种直接使用Notification类建立的方式已经过时了。我们可以为Notification设定如下属性
setContentText():设置通知内容
setSamllIcon():为通知设置小图标,如果不设置大图标,小图标则不显示,大图标显示小图标的图片
setContentTitle():设置通知标题
以上三项在Notification中必不可少,所以必须设置,如果不设置会报错。
setTicker():设置通知在状态栏里面的标题,即收到通知时在没有下拉的情况下显示几秒钟
setLargeIcon():为通知设置大图标,使用BitmapFactory创建图片。即使设置了大图标,状态栏仍然显示小图标。
setWhen(System.currentTimeMillis())设置时间(当前系统时间),默认也是这个时间,所以一般不需要设置。
setAutoCancel():设置点击通知后,自动移除通知
setContentInfo()设置通知信息,位置在时间下面小图标左边
setDefaults():设置通知为默认音效、振动、闪屏,值为:
Notification.DEFAULT_SOUND:使用默认声音
Notification.DEFAULT_VIBRATE:设置默认振动
Notification.DEFAULT_LIGHTS:设置使用默认LED灯闪烁
Notification.DEFAULT_ALL:设置使用默认声音,振动,闪光灯
如果单个设置提示效果最后设置的会覆盖前面的,所以只能设置其中一个。
setSound(Uri.parse("file:///sdcard/apple.mp3")):设置自定义声音
setVibrate(newlong[]{1000,5000,1000,3000}):设置自定义振动,时长的单位是毫秒,数组中数字的含义依次是[静止时长,震动时长,静止时长,震动时长]
setLights(int argb, int onMs, int offMs):设定前置LED灯的闪烁速率,持续毫秒数,停顿毫秒数
注意:需要添加闪光灯和振动器的权限
android.permission.FALSHLIGHT
android.permission.VIBRATE
setProgress(int max,int progress,booleanindeterminate)设置进度条,max最大数,progress设定当前的进度,indeterminate设定是否是一个确定进度值的进度条,有进度(false),循环滚动(ture)。
setContentIntent():设置点击通知后将要启动的程序组件对应的PendingIntent(延时意图)。
pendingIntent是一种特殊的Intent,主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。
完成设定以后通过Notification.Builder.build()方法获取到Notificationg对象,再通过通知管理器notify()方法来启动通知。这里需要设定一个id和Notification,如果不同Notification使用相同的id后来的Notification在出现前会移除先来的Notification。
大视图通知与标准视图通知大体相同,它需要借助NotificationCompat.Style完成设置,然后使用NotificationCompat.Builder.setStyle()方法为Builder设置Style,再通过Notification.Builder.build()方法获取到Notificationg对象,再通过通知管理器notify()方法来启动通知。大视图通知分为三种
NotificationCompat.BigPictureStyle, 在细节部分显示一个位图。
NotificationCompat.BigTextStyle,在细节部分显示一个大的文本块。
NotificationCompat.InboxStyle,在细节部分显示一段行文本。
它们有不同的方法为它们添加细节,与标准视图不同的是,标准视图无论显示多少条都是一样的样式,大视图同时显示两条会将先出现一条隐藏细节信息仅显示时间和大图标。
我们知道可以通过左右滑动移除通知,也可以通过NotificationManaget.cancle()方法来移除通知,参数为整型的id,通过id来标记Notification。
一下做一个关于标准视图通知和大视图通知的全面的测试
布局文件如下
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"
android:gravity="center_vertical" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="sendNormal"
android:text="发送标准视图通知" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="sendBig"
android:text="发送大视图通知" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="cancle"
android:text="移除通知" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="progress"
android:text="发送进度条通知" />
</LinearLayout>
activity_second.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" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="picture"
android:text="显示位图" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="text"
android:text="显示文本块" />
</LinearLayout>
类文件如下
MainActivity.java
import android.app.Activity;
import android.app.Notification;
import android.app.Notification.Builder;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.view.Window;
public class MainActivity extends Activity {
//通知管理器
private NotificationManager notificationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//实例化
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
public void sendNormal(View v){
Notification.Builder builder = new Builder(this);//获取Notification的内部类Builder,通过Builder来为Notification设置各区域的内容
//通知有六个区域需要设置,以下三个必须设置(标题,内容,小图标),否则报错
builder.setSmallIcon(R.drawable.cocktail);//只设置小图标不会显示小图标,而是把小图标在大图标的位置显示
builder.setContentText("国庆期间,苏州昆山巴城镇出现“超人”,有目击者称他来自氪星,氪星是DC漫画中超人的故乡。");//内容
builder.setContentTitle("昆山惊现氪星人");//标题
builder.setDefaults(Notification.DEFAULT_SOUND);//设置提示音,这里是系统提示音
builder.setDefaults(Notification.DEFAULT_LIGHTS);//呼吸灯提示,需要在配置文件中设置权限
builder.setDefaults(Notification.DEFAULT_VIBRATE);//震动,需要在配置文件中设置权限
//以上三条只有最后一条生效,也就是说这三种属性只能出现一种
builder.setTicker("趣闻收鉴");//刚收到通知时在手机顶部显示一下的内容
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.chihuahua_bone);
builder.setLargeIcon(bitmap);//设置大图标,必须是位图
builder.setContentInfo("趣闻");//设置小图标旁边的消息
builder.setWhen(System.currentTimeMillis());//设置小图标上面显示的时间,不设置会显示系统时间,这里也是系统时间
//PandingIntent与Intent的区别在于PandingIntent是延迟意图,并非像Intent一般启动就执行,而是等用户点击后才执行
PendingIntent pIntent = PendingIntent.getActivity(this, 1, //请求码
new Intent(this,SecondActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT);//设置事件为广播刷新后覆盖原信息
builder.setContentIntent(pIntent);//设置意图
builder.setAutoCancel(true);//设置自动移除,即点击后移除
Notification build = builder.build();//获取Notification
notificationManager.notify(1,build);//执行通知,需要设置ID
}
public void sendBig(View v){
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.chihuahua_bone);//设置小图标,同上
builder.setContentTitle("大视图的标题1");//设置标题,同上
builder.setDefaults(Notification.DEFAULT_ALL);//设置全部提示效果
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.setBigContentTitle("大视图的标题2");//这里再设置一次标题会覆盖之前设置的
inboxStyle.addLine("大视图的第一段文字");//增加文字段
inboxStyle.addLine("大视图的第二段文字");
inboxStyle.addLine("大视图的第三段文字");
inboxStyle.addLine("大视图的第四段文字");
inboxStyle.addLine("大视图的第五段文字");
inboxStyle.setSummaryText("www.briup.com");//设置总结文字,显示在最下面
builder.setStyle(inboxStyle);
Notification build = builder.build();
notificationManager.notify(2, build);//同上,ID如果设置相同只能显示一个通知,如果已经有了一个会先移除再显示新的
}
public void cancle(View v){
notificationManager.cancel(2);//通过ID移除通知
}
public void progress(View v){
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.chihuahua_bone);
builder.setContentTitle("Loading...");
builder.setContentText("DownLoading");
builder.setProgress(100, 0, true);
builder.setAutoCancel(true);
Notification build = builder.build();
notificationManager.notify(3,build);
}
}
SecondActivity.java
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.view.Window;
public class SecondActivity extends Activity {
private NotificationManager notificationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_second);
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
public void picture(View v){
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.cocktail);
NotificationCompat.BigPictureStyle picture = new NotificationCompat.BigPictureStyle();
picture.setBigContentTitle("BigPicture");
picture.setSummaryText("www.briup.com");//显示在标题下面
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.chihuahua_bone);
picture.bigPicture(b);
builder.setStyle(picture);
Notification build = builder.build();
notificationManager.notify(1, build);
}
public void text(View v){
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.cocktail);
NotificationCompat.BigTextStyle text = new NotificationCompat.BigTextStyle();
text.setBigContentTitle("BigText");
text.setSummaryText("www.briup.com");//显示在最下面
String cs = "那是一个科技高度发达,变异生物横行的时代。作为万兽之灵的人类成为了变异的中心,同时也迎来了一个时代的终结,一个世界的终结。变异的人类获得了不凡的能力,某种程度上,这代表着一种进化。很快拥有超能力的人类开始与正常人类格格不入,人类之间的分歧日益变大,矛盾愈演愈烈,大小冲突发生在世界各地,由于变异人类的数量较少,总是被人类军队暴力镇压。逐渐的,变异的人类开始结盟,而只有具有相同特性的变异人类才愿意作为同盟,毕竟混乱的年代没有共同的利益也就没有信任。传说中具有永生能力的狼人阵营和吸血鬼阵营是两大最强联盟,它们自称“狼啃族”和“吸血鬼皇室”。由于天生就是宿敌,在和人类保持对峙的同时,两大阵营亦在暗自较劲。";
text.bigText(cs);
builder.setStyle(text);
Notification build = builder.build();
notificationManager.notify(2, build);
}
}
配置文件如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.briup.notification"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="24" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second" >
</activity>
</application>
</manifest>
效果如下
setTicker()的效果,我们看到它显示的是小图标
不下拉的情况下显示的也是小图标
下面是大视图行文本和有进度条的视图
点击后,切换界面,视图移除
大视图位图
我们看到大视图文本块通知出现后大视图位图通知细节就隐藏了
当然了,关于通知在实际开发中都是在一定条件下被动的弹出来的,而不是像上面这样主动点击,以上只是一个练习Notification的测试。