//安卓在8.0对通知有比较大更新,旧的API在8.0以上版本失效,下面封装工具类方便使用
/**
* @author zhudaihao
* @date 2020-10-13
* 通知工具类
*/
public class NotificationUtils {
/**
* 创建渠道兼容8.0以上版本
*
* @param channelId 渠道id
* @param channelName 渠道名称
* @param importance 重要性等级
*/
public static void create(String channelId, String channelName, int importance, Context context) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}
}
/**
* 发送 通知
*
* @param channelId 渠道id
* @param title 标题
* @param text 内容
* @param smallIcon 小图标
* @param largeIcon 大图标
* @param autoCancel 点击后关闭通知
* @param id 唯一id
* @param context 上下文
* @param clickToActivity 点击通知跳转对应页面
*/
public static void send(@NonNull String channelId, CharSequence title, CharSequence text, int smallIcon, Bitmap largeIcon, boolean autoCancel, int id, Context context, Class<?> clickToActivity) {
NotificationManager manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
setSend(channelId, title, text, smallIcon, largeIcon, autoCancel, id, context, manager,clickToActivity);
}
/**
* 发送 引导开启消息通知
*
* @param channelId 渠道id
* @param title 标题
* @param text 内容
* @param smallIcon 小图标
* @param largeIcon 大图标
* @param autoCancel 点击后关闭通知
* @param id 唯一id
* @param context 上下文
* @param clickToActivity 点击通知跳转对应页面
*/
public static void sendGuidance(@NonNull String channelId, CharSequence title, CharSequence text, int smallIcon, Bitmap largeIcon, boolean autoCancel, int id, Context context, Class<?> clickToActivity) {
NotificationManager manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
//判断该app是否打开了通知,如果没有的话就打开手机设置页面
if (!isNotificationEnabled(context)) {
gotoSet(context);
} else {
//判断是否关闭对应渠道通知
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = manager.getNotificationChannel(channelId);
channel.setShowBadge(true);//设置红色角标
//引导设置开启对应的渠道消息通知
if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
Log.e("zdh", "--------channel " + channel.toString());
Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());
context.startActivity(intent);
} else {
setSend(channelId, title, text, smallIcon, largeIcon, autoCancel, id, context, manager,clickToActivity);
}
} else {
setSend(channelId, title, text, smallIcon, largeIcon, autoCancel, id, context, manager,clickToActivity);
}
}
}
/**
* 发送消息配置代码
*
* @param channelId 渠道id
* @param title 标题
* @param text 内容
* @param smallIcon 小图标
* @param largeIcon 大图标
* @param autoCancel 是否可以取消
* @param id 唯一id
* @param context 上下文
* @param clickToActivity 点击通知跳转对应页面
*/
private static void setSend(@NonNull String channelId, CharSequence title, CharSequence text, int smallIcon, Bitmap largeIcon, boolean autoCancel, int id, Context context, NotificationManager manager, Class<?> clickToActivity) {
Intent intent = new Intent(context, clickToActivity);
PendingIntent pendingIntent = PendingIntent.getActivity(context, id, intent, id);
Notification notification = new NotificationCompat.Builder(context, channelId)
.setContentTitle(title)
.setContentText(text)
.setWhen(System.currentTimeMillis())
.setSmallIcon(smallIcon)
.setLargeIcon(largeIcon)
.setAutoCancel(autoCancel)
// .setNumber(2)//设置红色角标数量
.setContentIntent(pendingIntent)//设置广播接收者监听点击事件
.build();
manager.notify(id, notification);
}
/**
* 判断是否开启 消息通知
*
* @param context
* @return
*/
private static boolean isNotificationEnabled(Context context) {
boolean isOpened = false;
try {
isOpened = NotificationManagerCompat.from(context).areNotificationsEnabled();
} catch (Exception e) {
e.printStackTrace();
isOpened = false;
}
return isOpened;
}
/**
* 引导开启 消息通知功能
*
* @param context 上下文
*/
private static void gotoSet(Context context) {
Intent intent = new Intent();
if (Build.VERSION.SDK_INT >= 26) {
// android 8.0引导
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());
} else if (Build.VERSION.SDK_INT >= 21) {
// android 5.0-7.0
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
intent.putExtra("app_package", context.getPackageName());
intent.putExtra("app_uid", context.getApplicationInfo().uid);
} else {
// 其他
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
//使用
public class NotificationActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notification);
//初始化 通知
initNotification();
}
private void initNotification() {
//聊天的通知
String channelId = "chat";
String channelName = "聊天消息";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationUtils.create(channelId, channelName, importance,this);
}
//使用
public void sendChatMsg(View view) {
NotificationUtils.send("chat","收到一条聊天消息","今天中午吃什么?", R.mipmap.music,BitmapFactory.decodeResource(getResources(), R.mipmap.vip_icon),true,1,this,NotificationActivity.class);
}
}