小图标,使用setSamllIcon()方法设置。
标题,使用setContentTitle()方法设置。
文本内容,使用setContentText()方法设置。
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高,宽度为屏幕标准。
标准视图的通知主体内容有一下几个:
1.通知标题。
2.大图标。
3.通知内容。
4.通知消息。
5.小图标。
6.通知的时间,一般为系统时间,也可以使用setWhen()设置。
而对于大视图(Big View)而言,它的细节区域只能显示256dp高度的内容,并且只对Android4.1+之后的设备才支持,它比标准视图不一样的地方,均需要使用setStyle()方法设定
setStyle()传递一个NotificationCompat.Style对象,它是一个抽象类,Android为我们提供了三个实现类,用于显示不同的场景。分别是:
setStyle()传递一个NotificationCompat.Style对象,它是一个抽象类,Android为我们提供了三个实现类,用于显示不同的场景。分别是:
NotificationCompat.BigPictureStyle, 在细节部分显示一个256dp高度的位图。
NotificationCompat.BigTextStyle,在细节部分显示一个大的文本块。
NotificationCompat.InboxStyle,在细节部分显示一段行文本。
Notification.Builder类中提供一个setProgress(int max,int progress,boolean indeterminate)方法用于设置进度条,max用于设定进度的最大数,progress用于设定当前的进度,indeterminate用于设定是否是一个确定进度的进度条。通过indeterminate的设置,可以实现两种不同样式的进度条,一种是有进度刻度的(true),一种是循环流动的(false)。
一种是有进度刻度的(false),一种是循环流动的(true)
builder.setProgress(0, 0, true);//设置为true,表示流动
builder.setProgress(100, 100, false);//设置为false,表示刻度
RemoteViews contentViews = new RemoteViews(getPackageName(),
R.layout.custom_notification);
contentViews.setImageViewResource(R.id.imageNo, R.drawable.btm1);
contentViews.setTexViewText(R.id.titleNo, “xxx”);
contentViews.setTexViewText(R.id.textNo, “xxx”);
NotificationCompat.Builder.setContent(RemoteViews)
设定提示响应
对于有些通知,需要调用一些设备的资源,使用户能更快的发现有新通知,一般可设定的响应有:铃声、闪光灯、震动。对于这三个属性,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"/>
实例
点击按钮发送通知
package example.li_yuweii.notificationdemo;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.app.NotificationCompat;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void btnNotification(View view) {
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//设置属性
builder.setContentText("通知来啦");
builder.setContentTitle("标题在这里");
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification));
builder.setTicker("Ticker是什么");
builder.setDefaults(Notification.DEFAULT_ALL);
// 声音可以自定义
// Uri.fromFile()
// builder.setSound();
// 设置点击打开Activity, 广播,Service
// PendingIntent 可以包裹一个Intent对象,指定的是 XxxActivity.class "action"
//跳转Activity
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("url", "www.baidu.com");
// !!!使用通知的PendingIntent时,必须设置 Intent 的 FLAG, 针对于Activity
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pi = PendingIntent.getActivity(this, 998, intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pi);
//通知栏添加按钮点击事件,跳转service
Intent playMusic = new Intent(this, MusicService.class);
playMusic.putExtra("action", "play");
PendingIntent pendingIntent = PendingIntent.getService(this, 999, playMusic, PendingIntent.FLAG_UPDATE_CURRENT);
builder.addAction(R.drawable.notification, "播放", pendingIntent);
Notification notification = builder.build();
managerCompat.notify(998, notification);
}
}
跳转的service
package example.li_yuweii.notificationdemo;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class MusicService extends Service {
public MusicService() {
}
private MediaPlayer mediaPlayer;
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = MediaPlayer.create(this, R.raw.lifeforeverloveyou);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
String action = intent.getStringExtra("action");
if ("play".equals(action)) {
mediaPlayer.start();
}
}
return START_FLAG_REDELIVERY;
}
}