源码整理
This commit is contained in:
@@ -54,18 +54,19 @@ public class NotificationManagerUtils {
|
|||||||
|
|
||||||
// ================================== 构造方法(初始化核心资源,前置校验)=================================
|
// ================================== 构造方法(初始化核心资源,前置校验)=================================
|
||||||
public NotificationManagerUtils(Context context) {
|
public NotificationManagerUtils(Context context) {
|
||||||
LogUtils.d(TAG, "构造方法执行");
|
LogUtils.d(TAG, "NotificationManagerUtils: 构造方法执行 | context=" + context);
|
||||||
// 前置校验:Context非空
|
// 前置校验:Context非空
|
||||||
if (context == null) {
|
if (context == null) {
|
||||||
LogUtils.e(TAG, "构造失败:context is null");
|
LogUtils.e(TAG, "NotificationManagerUtils: 构造失败:context is null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 初始化核心资源
|
// 初始化核心资源
|
||||||
this.mContext = context.getApplicationContext();
|
this.mContext = context.getApplicationContext();
|
||||||
this.mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
|
this.mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
LogUtils.d(TAG, "NotificationManagerUtils: 核心资源初始化完成 | mContext=" + mContext + " | mNotificationManager=" + mNotificationManager);
|
||||||
// 初始化通知渠道(API26+ 必需)
|
// 初始化通知渠道(API26+ 必需)
|
||||||
initNotificationChannels();
|
initNotificationChannels();
|
||||||
LogUtils.d(TAG, "构造完成:核心资源初始化成功");
|
LogUtils.d(TAG, "NotificationManagerUtils: 构造完成");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ================================== 核心初始化方法(通知渠道,API分级适配)=================================
|
// ================================== 核心初始化方法(通知渠道,API分级适配)=================================
|
||||||
@@ -73,14 +74,15 @@ public class NotificationManagerUtils {
|
|||||||
* 初始化通知渠道:前台服务渠道(无铃声+无振动)、提醒渠道(系统默认铃声+无振动)
|
* 初始化通知渠道:前台服务渠道(无铃声+无振动)、提醒渠道(系统默认铃声+无振动)
|
||||||
*/
|
*/
|
||||||
private void initNotificationChannels() {
|
private void initNotificationChannels() {
|
||||||
|
LogUtils.d(TAG, "initNotificationChannels: 执行通知渠道初始化");
|
||||||
// API<26 无渠道机制,直接返回
|
// API<26 无渠道机制,直接返回
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||||
LogUtils.d(TAG, "initNotificationChannels:API<26,无需创建渠道");
|
LogUtils.d(TAG, "initNotificationChannels: API<26,无需创建渠道");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 通知服务为空,避免空指针
|
// 通知服务为空,避免空指针
|
||||||
if (mNotificationManager == null) {
|
if (mNotificationManager == null) {
|
||||||
LogUtils.e(TAG, "initNotificationChannels失败:NotificationManager is null");
|
LogUtils.e(TAG, "initNotificationChannels: 失败:NotificationManager is null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,6 +98,7 @@ public class NotificationManagerUtils {
|
|||||||
foregroundChannel.setSound(null, null); // 强制无铃声
|
foregroundChannel.setSound(null, null); // 强制无铃声
|
||||||
foregroundChannel.setShowBadge(false);
|
foregroundChannel.setShowBadge(false);
|
||||||
foregroundChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
|
foregroundChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
|
||||||
|
LogUtils.d(TAG, "initNotificationChannels: 前台服务渠道配置完成");
|
||||||
|
|
||||||
// 2. 电池提醒渠道(中优先级,系统默认铃声,无振动)
|
// 2. 电池提醒渠道(中优先级,系统默认铃声,无振动)
|
||||||
NotificationChannel remindChannel = new NotificationChannel(
|
NotificationChannel remindChannel = new NotificationChannel(
|
||||||
@@ -109,11 +112,12 @@ public class NotificationManagerUtils {
|
|||||||
remindChannel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), Notification.AUDIO_ATTRIBUTES_DEFAULT);
|
remindChannel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), Notification.AUDIO_ATTRIBUTES_DEFAULT);
|
||||||
remindChannel.setShowBadge(false);
|
remindChannel.setShowBadge(false);
|
||||||
remindChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
|
remindChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
|
||||||
|
LogUtils.d(TAG, "initNotificationChannels: 电池提醒渠道配置完成");
|
||||||
|
|
||||||
// 注册渠道到系统
|
// 注册渠道到系统
|
||||||
mNotificationManager.createNotificationChannel(foregroundChannel);
|
mNotificationManager.createNotificationChannel(foregroundChannel);
|
||||||
mNotificationManager.createNotificationChannel(remindChannel);
|
mNotificationManager.createNotificationChannel(remindChannel);
|
||||||
LogUtils.d(TAG, "initNotificationChannels成功:创建前台服务+电池提醒渠道");
|
LogUtils.d(TAG, "initNotificationChannels: 成功:创建前台服务+电池提醒渠道");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ================================== 对外核心方法(前台服务通知:启动/更新/取消)=================================
|
// ================================== 对外核心方法(前台服务通知:启动/更新/取消)=================================
|
||||||
@@ -121,26 +125,26 @@ public class NotificationManagerUtils {
|
|||||||
* 启动前台服务通知(API30适配,无铃声)
|
* 启动前台服务通知(API30适配,无铃声)
|
||||||
*/
|
*/
|
||||||
public void startForegroundServiceNotify(Service service, NotificationMessage message) {
|
public void startForegroundServiceNotify(Service service, NotificationMessage message) {
|
||||||
LogUtils.d(TAG, "startForegroundServiceNotify执行 | notifyId=" + NOTIFY_ID_FOREGROUND_SERVICE);
|
LogUtils.d(TAG, "startForegroundServiceNotify: 执行 | notifyId=" + NOTIFY_ID_FOREGROUND_SERVICE + " | service=" + service + " | message=" + message);
|
||||||
// 前置校验:参数非空
|
// 前置校验:参数非空
|
||||||
if (service == null || message == null || mNotificationManager == null) {
|
if (service == null || message == null || mNotificationManager == null) {
|
||||||
LogUtils.e(TAG, "startForegroundServiceNotify失败:param is null | service=" + service + " | message=" + message + " | mNotificationManager=" + mNotificationManager);
|
LogUtils.e(TAG, "startForegroundServiceNotify: 失败:param is null | service=" + service + " | message=" + message + " | mNotificationManager=" + mNotificationManager);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构建前台通知
|
// 构建前台通知
|
||||||
mForegroundServiceNotify = buildForegroundNotification(message);
|
mForegroundServiceNotify = buildForegroundNotification(message);
|
||||||
if (mForegroundServiceNotify == null) {
|
if (mForegroundServiceNotify == null) {
|
||||||
LogUtils.e(TAG, "startForegroundServiceNotify失败:构建通知为空");
|
LogUtils.e(TAG, "startForegroundServiceNotify: 失败:构建通知为空");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 启动前台服务(API30无FOREGROUND_SERVICE_TYPE限制,全版本通用)
|
// 启动前台服务(API30无FOREGROUND_SERVICE_TYPE限制,全版本通用)
|
||||||
try {
|
try {
|
||||||
service.startForeground(NOTIFY_ID_FOREGROUND_SERVICE, mForegroundServiceNotify);
|
service.startForeground(NOTIFY_ID_FOREGROUND_SERVICE, mForegroundServiceNotify);
|
||||||
LogUtils.d(TAG, "startForegroundServiceNotify成功");
|
LogUtils.d(TAG, "startForegroundServiceNotify: 成功");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogUtils.e(TAG, "startForegroundServiceNotify异常", e);
|
LogUtils.e(TAG, "startForegroundServiceNotify: 异常", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,23 +152,23 @@ public class NotificationManagerUtils {
|
|||||||
* 更新前台服务通知内容(复用通知ID,保持无铃声)
|
* 更新前台服务通知内容(复用通知ID,保持无铃声)
|
||||||
*/
|
*/
|
||||||
public void updateForegroundServiceNotify(NotificationMessage message) {
|
public void updateForegroundServiceNotify(NotificationMessage message) {
|
||||||
LogUtils.d(TAG, "updateForegroundServiceNotify执行 | notifyId=" + NOTIFY_ID_FOREGROUND_SERVICE);
|
LogUtils.d(TAG, "updateForegroundServiceNotify: 执行 | notifyId=" + NOTIFY_ID_FOREGROUND_SERVICE + " | message=" + message);
|
||||||
if (message == null || mNotificationManager == null) {
|
if (message == null || mNotificationManager == null) {
|
||||||
LogUtils.e(TAG, "updateForegroundServiceNotify失败:param is null | message=" + message + " | mNotificationManager=" + mNotificationManager);
|
LogUtils.e(TAG, "updateForegroundServiceNotify: 失败:param is null | message=" + message + " | mNotificationManager=" + mNotificationManager);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mForegroundServiceNotify = buildForegroundNotification(message);
|
mForegroundServiceNotify = buildForegroundNotification(message);
|
||||||
if (mForegroundServiceNotify == null) {
|
if (mForegroundServiceNotify == null) {
|
||||||
LogUtils.e(TAG, "updateForegroundServiceNotify失败:构建通知为空");
|
LogUtils.e(TAG, "updateForegroundServiceNotify: 失败:构建通知为空");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mNotificationManager.notify(NOTIFY_ID_FOREGROUND_SERVICE, mForegroundServiceNotify);
|
mNotificationManager.notify(NOTIFY_ID_FOREGROUND_SERVICE, mForegroundServiceNotify);
|
||||||
LogUtils.d(TAG, "updateForegroundServiceNotify成功");
|
LogUtils.d(TAG, "updateForegroundServiceNotify: 成功");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogUtils.e(TAG, "updateForegroundServiceNotify异常", e);
|
LogUtils.e(TAG, "updateForegroundServiceNotify: 异常", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,10 +176,10 @@ public class NotificationManagerUtils {
|
|||||||
* 取消前台服务通知(Service销毁时调用)
|
* 取消前台服务通知(Service销毁时调用)
|
||||||
*/
|
*/
|
||||||
public void cancelForegroundServiceNotify() {
|
public void cancelForegroundServiceNotify() {
|
||||||
LogUtils.d(TAG, "cancelForegroundServiceNotify执行 | notifyId=" + NOTIFY_ID_FOREGROUND_SERVICE);
|
LogUtils.d(TAG, "cancelForegroundServiceNotify: 执行 | notifyId=" + NOTIFY_ID_FOREGROUND_SERVICE);
|
||||||
cancelNotification(NOTIFY_ID_FOREGROUND_SERVICE);
|
cancelNotification(NOTIFY_ID_FOREGROUND_SERVICE);
|
||||||
mForegroundServiceNotify = null; // 置空释放
|
mForegroundServiceNotify = null; // 置空释放
|
||||||
LogUtils.d(TAG, "cancelForegroundServiceNotify成功");
|
LogUtils.d(TAG, "cancelForegroundServiceNotify: 成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ================================== 对外核心方法(电池提醒通知:发送)=================================
|
// ================================== 对外核心方法(电池提醒通知:发送)=================================
|
||||||
@@ -183,23 +187,23 @@ public class NotificationManagerUtils {
|
|||||||
* 发送电池提醒通知(系统默认铃声,无振动)
|
* 发送电池提醒通知(系统默认铃声,无振动)
|
||||||
*/
|
*/
|
||||||
public void showRemindNotification(Context context, NotificationMessage message) {
|
public void showRemindNotification(Context context, NotificationMessage message) {
|
||||||
LogUtils.d(TAG, "showRemindNotification执行 | notifyId=" + NOTIFY_ID_REMIND);
|
LogUtils.d(TAG, "showRemindNotification: 执行 | notifyId=" + NOTIFY_ID_REMIND + " | context=" + context + " | message=" + message);
|
||||||
if (context == null || message == null || mNotificationManager == null) {
|
if (context == null || message == null || mNotificationManager == null) {
|
||||||
LogUtils.e(TAG, "showRemindNotification失败:param is null | context=" + context + " | message=" + message + " | mNotificationManager=" + mNotificationManager);
|
LogUtils.e(TAG, "showRemindNotification: 失败:param is null | context=" + context + " | message=" + message + " | mNotificationManager=" + mNotificationManager);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Notification remindNotify = buildRemindNotification(context, message);
|
Notification remindNotify = buildRemindNotification(context, message);
|
||||||
if (remindNotify == null) {
|
if (remindNotify == null) {
|
||||||
LogUtils.e(TAG, "showRemindNotification失败:构建通知为空");
|
LogUtils.e(TAG, "showRemindNotification: 失败:构建通知为空");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mNotificationManager.notify(NOTIFY_ID_REMIND, remindNotify);
|
mNotificationManager.notify(NOTIFY_ID_REMIND, remindNotify);
|
||||||
LogUtils.d(TAG, "showRemindNotification成功");
|
LogUtils.d(TAG, "showRemindNotification: 成功");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogUtils.e(TAG, "showRemindNotification异常", e);
|
LogUtils.e(TAG, "showRemindNotification: 异常", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,16 +212,16 @@ public class NotificationManagerUtils {
|
|||||||
* 取消指定ID的通知
|
* 取消指定ID的通知
|
||||||
*/
|
*/
|
||||||
public void cancelNotification(int notifyId) {
|
public void cancelNotification(int notifyId) {
|
||||||
LogUtils.d(TAG, "cancelNotification执行 | notifyId=" + notifyId);
|
LogUtils.d(TAG, "cancelNotification: 执行 | notifyId=" + notifyId);
|
||||||
if (mNotificationManager == null) {
|
if (mNotificationManager == null) {
|
||||||
LogUtils.e(TAG, "cancelNotification失败:NotificationManager is null");
|
LogUtils.e(TAG, "cancelNotification: 失败:NotificationManager is null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
mNotificationManager.cancel(notifyId);
|
mNotificationManager.cancel(notifyId);
|
||||||
LogUtils.d(TAG, "cancelNotification成功 | notifyId=" + notifyId);
|
LogUtils.d(TAG, "cancelNotification: 成功 | notifyId=" + notifyId);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogUtils.e(TAG, "cancelNotification异常 | notifyId=" + notifyId, e);
|
LogUtils.e(TAG, "cancelNotification: 异常 | notifyId=" + notifyId, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,16 +229,16 @@ public class NotificationManagerUtils {
|
|||||||
* 取消所有通知(兜底场景使用)
|
* 取消所有通知(兜底场景使用)
|
||||||
*/
|
*/
|
||||||
public void cancelAllNotifications() {
|
public void cancelAllNotifications() {
|
||||||
LogUtils.d(TAG, "cancelAllNotifications执行");
|
LogUtils.d(TAG, "cancelAllNotifications: 执行");
|
||||||
if (mNotificationManager == null) {
|
if (mNotificationManager == null) {
|
||||||
LogUtils.e(TAG, "cancelAllNotifications失败:NotificationManager is null");
|
LogUtils.e(TAG, "cancelAllNotifications: 失败:NotificationManager is null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
mNotificationManager.cancelAll();
|
mNotificationManager.cancelAll();
|
||||||
LogUtils.d(TAG, "cancelAllNotifications成功");
|
LogUtils.d(TAG, "cancelAllNotifications: 成功");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogUtils.e(TAG, "cancelAllNotifications异常", e);
|
LogUtils.e(TAG, "cancelAllNotifications: 异常", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,28 +247,30 @@ public class NotificationManagerUtils {
|
|||||||
* 构建前台服务通知(全版本无铃声+无振动)
|
* 构建前台服务通知(全版本无铃声+无振动)
|
||||||
*/
|
*/
|
||||||
private Notification buildForegroundNotification(NotificationMessage message) {
|
private Notification buildForegroundNotification(NotificationMessage message) {
|
||||||
LogUtils.d(TAG, "buildForegroundNotification执行");
|
LogUtils.d(TAG, "buildForegroundNotification: 执行 | message=" + message);
|
||||||
if (message == null || mContext == null) {
|
if (message == null || mContext == null) {
|
||||||
LogUtils.e(TAG, "buildForegroundNotification失败:param is null | message=" + message + " | mContext=" + mContext);
|
LogUtils.e(TAG, "buildForegroundNotification: 失败:param is null | message=" + message + " | mContext=" + mContext);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 内容兜底
|
// 内容兜底
|
||||||
String title = message.getTitle() != null && !message.getTitle().isEmpty() ? message.getTitle() : FOREGROUND_NOTIFY_TITLE_DEFAULT;
|
String title = message.getTitle() != null && !message.getTitle().isEmpty() ? message.getTitle() : FOREGROUND_NOTIFY_TITLE_DEFAULT;
|
||||||
String content = message.getContent() != null && !message.getContent().isEmpty() ? message.getContent() : FOREGROUND_NOTIFY_CONTENT_DEFAULT;
|
String content = message.getContent() != null && !message.getContent().isEmpty() ? message.getContent() : FOREGROUND_NOTIFY_CONTENT_DEFAULT;
|
||||||
LogUtils.d(TAG, "buildForegroundNotification:title=" + title + " | content=" + content);
|
LogUtils.d(TAG, "buildForegroundNotification: 内容兜底完成 | title=" + title + " | content=" + content);
|
||||||
|
|
||||||
Notification.Builder builder;
|
Notification.Builder builder;
|
||||||
// API分级构建
|
// API分级构建
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
// API26+:绑定前台渠道(渠道已配置无铃声)
|
// API26+:绑定前台渠道(渠道已配置无铃声)
|
||||||
builder = new Notification.Builder(mContext, CHANNEL_ID_FOREGROUND);
|
builder = new Notification.Builder(mContext, CHANNEL_ID_FOREGROUND);
|
||||||
|
LogUtils.d(TAG, "buildForegroundNotification: 使用API26+渠道构建");
|
||||||
} else {
|
} else {
|
||||||
// API<26:直接构建,手动禁用铃声振动
|
// API<26:直接构建,手动禁用铃声振动
|
||||||
builder = new Notification.Builder(mContext);
|
builder = new Notification.Builder(mContext);
|
||||||
builder.setSound(null);
|
builder.setSound(null);
|
||||||
builder.setVibrate(new long[]{0});
|
builder.setVibrate(new long[]{0});
|
||||||
builder.setDefaults(0);
|
builder.setDefaults(0);
|
||||||
|
LogUtils.d(TAG, "buildForegroundNotification: 使用API<26手动配置");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通用配置
|
// 通用配置
|
||||||
@@ -281,9 +287,12 @@ public class NotificationManagerUtils {
|
|||||||
builder.setLargeIcon(getAppIcon(mContext))
|
builder.setLargeIcon(getAppIcon(mContext))
|
||||||
.setColor(mContext.getResources().getColor(R.color.colorPrimary))
|
.setColor(mContext.getResources().getColor(R.color.colorPrimary))
|
||||||
.setPriority(Notification.PRIORITY_LOW);
|
.setPriority(Notification.PRIORITY_LOW);
|
||||||
|
LogUtils.d(TAG, "buildForegroundNotification: 补充API21+配置");
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder.build();
|
Notification notification = builder.build();
|
||||||
|
LogUtils.d(TAG, "buildForegroundNotification: 成功构建前台通知");
|
||||||
|
return notification;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ================================== 内部辅助方法(通知构建:电池提醒通知)=================================
|
// ================================== 内部辅助方法(通知构建:电池提醒通知)=================================
|
||||||
@@ -291,28 +300,30 @@ public class NotificationManagerUtils {
|
|||||||
* 构建电池提醒通知(全版本系统默认铃声+无振动)
|
* 构建电池提醒通知(全版本系统默认铃声+无振动)
|
||||||
*/
|
*/
|
||||||
private Notification buildRemindNotification(Context context, NotificationMessage message) {
|
private Notification buildRemindNotification(Context context, NotificationMessage message) {
|
||||||
LogUtils.d(TAG, "buildRemindNotification执行");
|
LogUtils.d(TAG, "buildRemindNotification: 执行 | context=" + context + " | message=" + message);
|
||||||
if (context == null || message == null) {
|
if (context == null || message == null) {
|
||||||
LogUtils.e(TAG, "buildRemindNotification失败:param is null | context=" + context + " | message=" + message);
|
LogUtils.e(TAG, "buildRemindNotification: 失败:param is null | context=" + context + " | message=" + message);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 内容兜底
|
// 内容兜底
|
||||||
String title = message.getTitle() != null && !message.getTitle().isEmpty() ? message.getTitle() : REMIND_NOTIFY_TITLE_DEFAULT;
|
String title = message.getTitle() != null && !message.getTitle().isEmpty() ? message.getTitle() : REMIND_NOTIFY_TITLE_DEFAULT;
|
||||||
String content = message.getContent() != null && !message.getContent().isEmpty() ? message.getContent() : REMIND_NOTIFY_CONTENT_DEFAULT;
|
String content = message.getContent() != null && !message.getContent().isEmpty() ? message.getContent() : REMIND_NOTIFY_CONTENT_DEFAULT;
|
||||||
LogUtils.d(TAG, "buildRemindNotification:title=" + title + " | content=" + content);
|
LogUtils.d(TAG, "buildRemindNotification: 内容兜底完成 | title=" + title + " | content=" + content);
|
||||||
|
|
||||||
Notification.Builder builder;
|
Notification.Builder builder;
|
||||||
// API分级构建
|
// API分级构建
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
// API26+:绑定提醒渠道(渠道已配置默认铃声)
|
// API26+:绑定提醒渠道(渠道已配置默认铃声)
|
||||||
builder = new Notification.Builder(context, CHANNEL_ID_REMIND);
|
builder = new Notification.Builder(context, CHANNEL_ID_REMIND);
|
||||||
|
LogUtils.d(TAG, "buildRemindNotification: 使用API26+渠道构建");
|
||||||
} else {
|
} else {
|
||||||
// API<26:手动配置默认铃声,关闭振动
|
// API<26:手动配置默认铃声,关闭振动
|
||||||
builder = new Notification.Builder(context);
|
builder = new Notification.Builder(context);
|
||||||
builder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI) // 显式默认铃声
|
builder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI) // 显式默认铃声
|
||||||
.setVibrate(new long[]{0})
|
.setVibrate(new long[]{0})
|
||||||
.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND);
|
.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND);
|
||||||
|
LogUtils.d(TAG, "buildRemindNotification: 使用API<26手动配置");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通用配置
|
// 通用配置
|
||||||
@@ -330,9 +341,12 @@ public class NotificationManagerUtils {
|
|||||||
builder.setLargeIcon(getAppIcon(context))
|
builder.setLargeIcon(getAppIcon(context))
|
||||||
.setColor(context.getResources().getColor(R.color.colorPrimary))
|
.setColor(context.getResources().getColor(R.color.colorPrimary))
|
||||||
.setPriority(Notification.PRIORITY_DEFAULT);
|
.setPriority(Notification.PRIORITY_DEFAULT);
|
||||||
|
LogUtils.d(TAG, "buildRemindNotification: 补充API21+配置");
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder.build();
|
Notification notification = builder.build();
|
||||||
|
LogUtils.d(TAG, "buildRemindNotification: 成功构建提醒通知");
|
||||||
|
return notification;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ================================== 内部辅助方法(创建跳转PendingIntent,API30安全适配)=================================
|
// ================================== 内部辅助方法(创建跳转PendingIntent,API30安全适配)=================================
|
||||||
@@ -340,19 +354,20 @@ public class NotificationManagerUtils {
|
|||||||
* 创建跳转MainActivity的PendingIntent,API23+ 添加IMMUTABLE标记(避免安全异常)
|
* 创建跳转MainActivity的PendingIntent,API23+ 添加IMMUTABLE标记(避免安全异常)
|
||||||
*/
|
*/
|
||||||
private PendingIntent createJumpPendingIntent(Context context, int requestCode) {
|
private PendingIntent createJumpPendingIntent(Context context, int requestCode) {
|
||||||
LogUtils.d(TAG, "createJumpPendingIntent执行 | requestCode=" + requestCode);
|
LogUtils.d(TAG, "createJumpPendingIntent: 执行 | requestCode=" + requestCode + " | context=" + context);
|
||||||
Intent intent = new Intent(context, MainActivity.class);
|
Intent intent = new Intent(context, MainActivity.class);
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
|
LogUtils.d(TAG, "createJumpPendingIntent: 跳转Intent配置完成");
|
||||||
|
|
||||||
// API23+ 必需添加IMMUTABLE,适配API30安全规范
|
// API23+ 必需添加IMMUTABLE,适配API30安全规范
|
||||||
int flags = PendingIntent.FLAG_UPDATE_CURRENT;
|
int flags = PendingIntent.FLAG_UPDATE_CURRENT;
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
flags |= PendingIntent.FLAG_IMMUTABLE;
|
flags |= PendingIntent.FLAG_IMMUTABLE;
|
||||||
LogUtils.d(TAG, "createJumpPendingIntent:添加FLAG_IMMUTABLE标记");
|
LogUtils.d(TAG, "createJumpPendingIntent: 添加FLAG_IMMUTABLE标记(API23+)");
|
||||||
}
|
}
|
||||||
|
|
||||||
PendingIntent pendingIntent = PendingIntent.getActivity(context, requestCode, intent, flags);
|
PendingIntent pendingIntent = PendingIntent.getActivity(context, requestCode, intent, flags);
|
||||||
LogUtils.d(TAG, "createJumpPendingIntent成功 | requestCode=" + requestCode);
|
LogUtils.d(TAG, "createJumpPendingIntent: 成功 | requestCode=" + requestCode);
|
||||||
return pendingIntent;
|
return pendingIntent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,33 +376,33 @@ public class NotificationManagerUtils {
|
|||||||
* 获取APP图标,失败返回默认图标
|
* 获取APP图标,失败返回默认图标
|
||||||
*/
|
*/
|
||||||
private Bitmap getAppIcon(Context context) {
|
private Bitmap getAppIcon(Context context) {
|
||||||
LogUtils.d(TAG, "getAppIcon执行");
|
LogUtils.d(TAG, "getAppIcon: 执行 | context=" + context);
|
||||||
try {
|
try {
|
||||||
PackageInfo pkgInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
|
PackageInfo pkgInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
|
||||||
Bitmap appIcon = BitmapFactory.decodeResource(context.getResources(), pkgInfo.applicationInfo.icon);
|
Bitmap appIcon = BitmapFactory.decodeResource(context.getResources(), pkgInfo.applicationInfo.icon);
|
||||||
LogUtils.d(TAG, "getAppIcon成功:获取应用图标");
|
LogUtils.d(TAG, "getAppIcon: 成功:获取应用图标");
|
||||||
return appIcon;
|
return appIcon;
|
||||||
} catch (PackageManager.NameNotFoundException e) {
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
LogUtils.e(TAG, "getAppIcon异常:获取应用图标失败,使用默认图标", e);
|
LogUtils.e(TAG, "getAppIcon: 异常:获取应用图标失败,使用默认图标", e);
|
||||||
return BitmapFactory.decodeResource(context.getResources(), NOTIFICATION_DEFAULT_ICON);
|
return BitmapFactory.decodeResource(context.getResources(), NOTIFICATION_DEFAULT_ICON);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ================================== 对外 getter 方法(仅前台通知实例,只读)=================================
|
|
||||||
public Notification getForegroundServiceNotify() {
|
|
||||||
return mForegroundServiceNotify;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ================================== 资源释放方法(避免内存泄漏)=================================
|
// ================================== 资源释放方法(避免内存泄漏)=================================
|
||||||
/**
|
/**
|
||||||
* 释放资源,销毁时调用
|
* 释放资源,销毁时调用
|
||||||
*/
|
*/
|
||||||
public void release() {
|
public void release() {
|
||||||
LogUtils.d(TAG, "release执行");
|
LogUtils.d(TAG, "release: 执行资源释放");
|
||||||
cancelForegroundServiceNotify();
|
cancelForegroundServiceNotify();
|
||||||
mNotificationManager = null;
|
mNotificationManager = null;
|
||||||
mContext = null;
|
mContext = null;
|
||||||
LogUtils.d(TAG, "release成功:所有资源已释放");
|
LogUtils.d(TAG, "release: 成功:所有资源已释放");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ================================== 对外 getter 方法(仅前台通知实例,只读)=================================
|
||||||
|
public Notification getForegroundServiceNotify() {
|
||||||
|
return mForegroundServiceNotify;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user