横幅通知,也称为提醒式通知,效果如下图:

这个效果在QQ,微信,钉钉等一些主流的App当中,大家一定很熟悉,今天就来说说如何实现。

可能会触发提醒式通知的条件有如下3种:

  • 用户的Activiity处于全屏模式(应用使用fullScreenIntent)
  • 通知的优先级很高,且在搭载Android 7.1(API级别25)及更低版本的设备上使用铃声或震动。
  • 在搭载Android 8.0(API级别为26)及更高版本的设备上,通知渠道的重要程度比较高。

但是现实往往是残酷的,当你按照要求照做之后发现8.0以上系统还是不能实现你想要的效果。下面来大概说道说道原因。

由于国内大多数App都比较流氓,喜欢这通知也发,那通知也发,导致用户被一堆垃圾信息困扰,系统为了保护用户不受此类消息的困扰,就关闭了权限,如果想要显示,就只能由用户手动打开该权限才行。而且系统没办法获取该权限是否打开。所以,当产品再拿QQ等国民应用来跟你说人家都能实现怎么怎么滴的时候请勇敢的怼回去。人家那些应用厂商一般都默认打开权限的,这没什么好说的,级别在那放着呢。

打开权限管理页面的方法,不同版本有些差别,需适配下:

//打开系统消息通知设置页面
Intent intent = new Intent();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//android 8.0引导,引导到CHANNEL_ID对应的渠道设置下intent.setAction(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);intent.putExtra(Settings.EXTRA_APP_PACKAGE, getContext().getPackageName());intent.putExtra(Settings.EXTRA_CHANNEL_ID, newChannel);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//android 5.0-7.0,引导到所有渠道设置下(单个渠道没有具体的设置)intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);intent.putExtra("app_package", getContext().getPackageName());intent.putExtra("app_uid", getContext().getApplicationInfo().uid);
} else {//其他intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);intent.setData(Uri.fromParts("package", getContext().getPackageName(), null));
}startActivity(intent);

上面是一种解决方式,还有人说了,那我想任何时候用户都能弹出横幅通知呢,那就自己写咯。大概思路就是用悬浮窗的方式展示一个Toast或者Dialog。

大概代码如下:

private static void showHeadsUpNotification(Context context, UMessage uMessage) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//1、判断是否开启了悬浮通知栏权限   注:部分华为无效if (!Settings.canDrawOverlays(MyApplication.getInstance())) {MessageDialog.show((AppCompatActivity) ActivityUtils.getTopActivity(), "提示","请打开" + AppUtils.getAppName() + "的悬浮窗权限,否则会有很多重要消息漏掉哦!", "确定", "取消").setOnOkButtonClickListener(new OnDialogButtonClickListener() {@Overridepublic boolean onClick(BaseDialog baseDialog, View v) {//未显示消息入队headsupMsgQueue.offer(uMessage);requestOverlayPermission();return false;}}).setOnCancelButtonClickListener(new OnDialogButtonClickListener() {@Overridepublic boolean onClick(BaseDialog baseDialog, View v) {return false;}});} else {//显示横幅通知showHeadsUpNotification_(context, uMessage);}}
}//请求悬浮窗权限
@TargetApi(Build.VERSION_CODES.M)
private static void requestOverlayPermission() {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);intent.setData(Uri.parse("package:" + AppUtils.getAppPackageName()));ActivityUtils.getTopActivity().startActivityForResult(intent, ALERT_WINDOW_PERMISSION_REQCODE);
}public static void showHeadsUpNotification_(Context context) {if (headsupMsgQueue.isEmpty())return;//由于一开始没有悬浮窗权限,所以当收到消息通知时先将他们暂时都存入队列中,当获得权限之后再显示横幅通知while (!headsupMsgQueue.isEmpty()) {UMessage uMessage = headsupMsgQueue.poll();if (uMessage != null) {showHeadsUpNotification_(context, uMessage);}}
}private static void showHeadsUpNotification_(Context context, UMessage uMessage) {new Handler(Looper.getMainLooper()).post(() -> {//这里要看是否在子线程中再加// 传入 Application 对象表示设置成全局的,但需要有悬浮窗权限new XToast<>(MyApplication.getInstance()).setView(R.layout.layout_headsup_notification)// 设置成可拖拽的//.setDraggable()// 设置显示时长.setDuration(6000)// 设置动画样式//.setAnimStyle(android.R.style.Animation_Translucent)// 设置外层是否能被触摸//.setOutsideTouchable(false)// 设置窗口背景阴影强度
//                .setBackgroundDimAmount(0.5f).setGravity(Gravity.TOP).setText(R.id.notification_app_name, AppUtils.getAppName()).setText(R.id.notification_title, uMessage.title).setText(R.id.notification_text, uMessage.text).setOnClickListener(new XToast.OnClickListener<View>() {@Overridepublic void onClick(XToast<?> toast, View view) {// 点击这个 View 后消失toast.cancel();if (uMessage.extra != null && uMessage.extra.containsKey("type") && uMessage.extra.containsKey("content")) {// 跳转到某个ActivityIntent handleIntent = new Intent(context, NotifyActivity.class);toast.startActivity(handleIntent);}}}).show();});}

代码仅提供实现思路,不能直接运行,有需要还是结合自己的需求自己写吧。

弹框可参考这两个库:
XPopup
XToast

最近一直搞这个通知,唉,系统升级版本越高权限控制是越来越严格了,有时候发现我们利用系统提供的能力无能为力的时候还是自己动手实现吧。

Android——横幅通知相关推荐

  1. Android Notification 手机系统横幅弹出提示框调用,横幅通知,RemoteViews使用实例

    直接上代码 :bundle是极光推送的bundle @Override public void onReceive(Context context, Intent intent) {try {Bund ...

  2. android中的横幅通知

    1.这个是点击按钮notice,然后按钮发送一个横幅通知 ,如果不想实现的话,可以剪切Onclick里面的内容 notice = findViewById(R.id.notice); notice.s ...

  3. Android 12 悬浮通知/横幅通知状态栏应用图标显示不全

    先看下问题的表现情况吧 这个模块的实现在SystemUI 这里先列举下与这个模块以及本文要描述的相关代码和资源文件,后面逐个分析 SystemUI/src/com/android/systemui/s ...

  4. Android笔记——横幅通知

    通知分为三种:下拉通知.锁屏通知.横幅通知.前两个通知内容是相同的,横幅通知的View需要单独定制(还有一种是只在通知栏出现一句话) 一般的app,只会默认开启"下拉通知"的权限. ...

  5. Android 阿里推送实现自定义铃声以及8.0以上横幅通知提醒

    自定义提示音: 1.在res下建raw 然后放入自定义提示音,如图: 2.在设置NotificationChannel时 mChannel.setSound(Uri.parse("andro ...

  6. AndroidO Notification横幅通知(HangUp Notification)

    文章目录 1. 配置 1.1 环境 1.2 参考博客 2. 上代码 2.1 逻辑代码 2.2 权限代码 1. 配置 1.1 环境 环境:// 2020-12-08 AndroidO (8以上) And ...

  7. Android手机关闭短信提醒,有打扰 漏消息?那是Android手机通知设置没弄好!

    原标题:有打扰 漏消息?那是Android手机通知设置没弄好! 在Android系统手机的设置内容中,"通知"是最容易被我们忽略的选项.实际上,如果你每天休息时都会被各种推送提醒打 ...

  8. android系统 通知管理,Android的通知系统

    Android的通知系统 默认分类 | 2015-07-07 08:21:24 | 阅读 1581 次 | 评论(0) : 将应用程序的一些重要信息通知给用户. 1.Toast 形式:一般在界面下半部 ...

  9. Android Notification通知详解

    Android Notification通知详解 Notification: (一).简介: 显示在手机状态栏的通知.Notification所代表的是一种具有全局效果的通知,程序一般通过Notifi ...

最新文章

  1. [oracle] Oracle存储过程里操作BLOB的字节数据的办法,例如写入32位整数
  2. 【WPF】MVVM模式的3种command
  3. [JDK 11] jcmd中的类加载器层次结构详细信息
  4. cad卸载_怎么把CAD卸载干净,老司机来教你
  5. LuoguP1268树的重量【构造/思维】By cellur925
  6. html改元素怎么保存,是否可以在NW.js中保存html元素更改?
  7. Springboot2.x +JPA 集成 Apache ShardingSphere 同库分表
  8. VUE系列-Vue核心应用(二)
  9. 可以设置选项背景颜色的DropDownList
  10. Matlab Tricks(三)—— subplot 的组织
  11. SQL SERVER 数据类型详解[zt]
  12. 面试记录五:腾讯后台研发
  13. 【场景化解决方案】ERP系统与钉钉实现数据互通
  14. python股票代码示例_Python应用实例之股市数据分析
  15. 学习笔记 | 百度搜索技巧
  16. eclipse远程连接Hadoop遇到的一些问题
  17. maven编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile
  18. 数学分析教程史济怀练习8.4
  19. remusic:仿网易云音乐 安卓版
  20. 领英批量撤回未通过邀请的技巧,置顶推荐

热门文章

  1. Go语言 有缓冲通道、协程池
  2. 编写SQL语句,从Customers中检索所有的顾客名称(cust_name),并按从Z到A的顺序显示结果
  3. ubuntu设置相机为固定焦距
  4. Stream流的学习
  5. 租房软件需要的是简单易用
  6. 人工智能的高层建筑取决于数据基础设施
  7. “双料王”傍身,极智嘉Geek+成功开辟行业新蓝海
  8. 重点工作事项督办督查跟踪管理方案
  9. 对话管理DST:Deep Neural Network Approach for the Dialog State Tracking Challenge
  10. Python Challenge-39 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。