-
創(chuàng)建Notification
初始化 NotificationManager 用來(lái)管理 Notification
NotificationManager manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
①構(gòu)建 Android 8.0渠道
//適配安卓8.0的消息渠道
String channelID = "channelID";
CharSequence channelName = "channelName";
// 如果想更改渠道設(shè)置的聲音或震動(dòng)等屬性
// 如果已經(jīng)創(chuàng)建此Id的Channel怖侦,只會(huì)復(fù)用舊屬性,新更改并不會(huì)生效
// ①清除應(yīng)用數(shù)據(jù)或者卸載重裝 會(huì)生效
// ②更換channelID 會(huì)生效
// *** 先刪除ID在重新創(chuàng)建 并不會(huì)生效 不生效 不生效
// notificationManager.deleteNotificationChannel(channelID);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
// 無(wú)通知音
channel.setSound(null, Notification.AUDIO_ATTRIBUTES_DEFAULT);
// 默認(rèn)通知音
channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), Notification.AUDIO_ATTRIBUTES_DEFAULT);
// 設(shè)置通知出現(xiàn)時(shí)的閃燈(如果 android 設(shè)備支持的話)
channel.enableLights(true);
channel.setLightColor(Color.RED);
// 設(shè)置通知出現(xiàn)時(shí)的震動(dòng)(如果 android 設(shè)備支持的話)
channel.enableVibration(true);
channel.setVibrationPattern(new long[]{100, 200});
// 創(chuàng)建渠道
manager.createNotificationChannel(channel);
}
②初始化NotificationCompat.Builder
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelID);
③配置NotificationCompat.Builder基本屬性
.setContentTitle("我是標(biāo)題")
.setContentText("我是內(nèi)容")
// 圖標(biāo)
.setSmallIcon(R.mipmap.app_logo);
④配置 < 8.0 版本的聲音瀑粥、震動(dòng)等屬性
// 設(shè)置鈴聲及震動(dòng)效果等(不設(shè)置默認(rèn)無(wú)聲音、震動(dòng))
.setDefaults(NotificationCompat.DEFAULT_ALL);
// 設(shè)置鈴聲(無(wú))
.setSound(null)
// 設(shè)置震動(dòng)
.setVibrate(new long[]{100, 200})
// 設(shè)置通知出現(xiàn)時(shí)的閃燈(如果 android 設(shè)備支持的話)
// int argb = 0xffff0000; // led燈光顏色
// int onMs = 300; // led亮燈持續(xù)時(shí)間
// int offMs = 100; // led熄燈持續(xù)時(shí)間
.setLights(argb,onMs,offMs);
-
自定義布局
初始化 RemoteViews
// 參數(shù)1:包名 參數(shù)2:自定義布局的資源Id
RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification_control);
自定義布局動(dòng)態(tài)設(shè)置文字镰踏、圖片資源
// 參數(shù)1:自定義布局中的控件id 參數(shù)2:圖片資源
contentView.setImageViewResource(R.id.play, R.mipmap.zanting);
// 參數(shù)1:自定義布局中的控件id 參數(shù)2:文本內(nèi)容
contentView.setTextViewText(R.id.title, "文本");
自定義布局中的控件的點(diǎn)擊事件
// 參數(shù)1:自定義布局中的控件id 參數(shù)2:pendingIntent
contentView.setOnClickPendingIntent(R.id.last, pendingIntent);
NotificationCompat.Builder加載自定義布局
builder.setCustomContentView(contentView);
-
顯示Notification
設(shè)置點(diǎn)擊通知的響應(yīng)
builder.setContentIntent(pendingIntent);
設(shè)置提醒標(biāo)識(shí)符Flags 可用"|"符號(hào)多個(gè)標(biāo)識(shí)拼接
必須設(shè)置 Notification.FLAG_ONGOING_EVENT 否則oppo手機(jī)不顯示通知
Notification notification = musicBuilder.build();
notification.flags = Notification.FLAG_ONGOING_EVENT;
// 點(diǎn)擊清除膊夹、側(cè)滑 不清除通知提醒 Notification.FLAG_NO_CLEAR;
// 點(diǎn)擊通知后自動(dòng)取消通知提醒 Notification.FLAG_AUTO_CANCEL
顯示通知
// notifyId 一樣 會(huì)覆蓋上一條通知
manager.notify(notifyId, notification);
移除通知
manager.cancel(notifyId);
-
PendingIntent
PendingIntent可以看作是對(duì)Intent的一個(gè)封裝,但它不是立刻執(zhí)行某個(gè)行為换怖,而是滿足某些條件或觸發(fā)某些事件后才執(zhí)行指定的行為。
①PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags) 用于啟動(dòng)一個(gè)Activity的PendingIntent對(duì)象.
②PendingIntent.getService(Context context, int requestCode, Intent intent, int flags)用于啟動(dòng)一個(gè)Service的PendingIntent對(duì)象
③PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags)用于向BroadcastReceiver的發(fā)送廣播的PendingIntent對(duì)象
-
判斷應(yīng)用是否開(kāi)啟通知欄
public static boolean isNotificationEnabled(Context context) {
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
return notificationManagerCompat.areNotificationsEnabled();
}
跳轉(zhuǎn)系統(tǒng)應(yīng)用權(quán)限界面
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getPackageName(), null));
startActivity(intent);