Android Service中弹出对话框

背景

     dialog 对话框只提供Activity上下文显示环境,但是很多时候需要在后台服务中显示对话框的场景,例如后台收到哪个反馈时,弹出对应的对话框提示用户。

解决方案:

1、添加权限:

<!--services权限-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

2、添加getApplicationContext()

记得做判断8.0以上系统
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {Objects.requireNonNull(window).setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));
} else {Objects.requireNonNull(window).setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
}
    private VoiceDialog boxDialog;private void showDialog() {View inflate = LayoutInflater.from(getApplicationContext()).inflate(R.layout.donghua_layout, null, false);boxDialog = new VoiceDialog(getApplicationContext(), inflate, VoiceDialog.LocationView.BOTTOM);
//        boxDialog.setCancelable(false);//是否可以点击DialogView外关闭Dialog
//        boxDialog.setCanceledOnTouchOutside(false);//是否可以按返回按钮关闭DialogboxDialog.show();boxDialog.showVoiceLum();}

3、对话框代码


/*** 语音* 对话框*/public class VoiceDialog extends Dialog {//Dialog Viewprivate View view;//Dialog弹出位置private LocationView locationView = LocationView.BOTTOM;/*** @param context 上下文* @param view    Dialog View*/public VoiceDialog(Context context, View view) {super(context, R.style.BoxDialog);this.view = view;}/*** @param context      上下文* @param view         Dialog View* @param locationView Dialog*                     弹出位置*/public VoiceDialog(Context context, View view, LocationView locationView) {super(context, R.style.BoxDialog);this.view = view;this.locationView = locationView;waveLineView = view.findViewById(R.id.waveLineView);tvContView = view.findViewById(R.id.tv_content);closeDialog = view.findViewById(R.id.close_dialog);showTxtContent("请说话");clickListener();}@SuppressLint("RtlHardcoded")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (null != view) {setContentView(view);setCancelable(true);//点击外部是否可以关闭DialogsetCanceledOnTouchOutside(true);//返回键是否可以关闭DialogWindow window = this.getWindow();assert window != null;switch (locationView) {case TOP:window.setGravity(Gravity.TOP);break;case BOTTOM:window.setGravity(Gravity.BOTTOM);break;case CENTER:window.setGravity(Gravity.CENTER);break;}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {Objects.requireNonNull(window).setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));} else {Objects.requireNonNull(window).setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));}window.setBackgroundDrawableResource(android.R.color.transparent);WindowManager.LayoutParams params = window.getAttributes();params.width = WindowManager.LayoutParams.WRAP_CONTENT;params.height = WindowManager.LayoutParams.WRAP_CONTENT;params.y = 10;//设置与底部距离window.setAttributes(params);}}/*** 语音* 播放动画*/private WaveLineView waveLineView;private TextView tvContView;private ImageView closeDialog;public void showVoiceLum() {if (waveLineView != null) {waveLineView.startAnim();waveLineView.onResume();}}/*** 语音* 停止动画*/public void stopAminVoice() {if (waveLineView != null) {waveLineView.onPause();waveLineView.clearDraw();}}/*** 设置* 内容*/public void showTxtContent(String ct) {if (tvContView != null) {tvContView.setText(ct);}}/*** 显示* 位置*/public enum LocationView {CENTER, TOP, BOTTOM}/*** 事件* 监听*/private void clickListener() {if (closeDialog != null) {closeDialog.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dismiss();}});}}}

4、对话框布局代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="wrap_content"android:layout_height="wrap_content"><RelativeLayoutandroid:id="@+id/parent_layout"android:layout_width="@dimen/dp_160"android:layout_height="@dimen/dp_38"android:background="@drawable/kdvoice_shape"><ImageViewandroid:id="@+id/close_dialog"android:layout_width="@dimen/dp_10"android:layout_height="@dimen/dp_10"android:layout_alignRight="@id/tv_content"android:layout_alignParentRight="true"android:layout_marginTop="@dimen/dp_4"android:layout_marginRight="@dimen/dp_8"android:src="@drawable/closed_icon" /><TextViewandroid:id="@+id/tv_content"android:layout_width="@dimen/dp_140"android:layout_height="@dimen/dp_20"android:layout_marginLeft="@dimen/dp_5"android:ellipsize="end"android:gravity="center_horizontal"android:maxEms="26"android:paddingTop="@dimen/dp_3"android:singleLine="true"android:text="请说话"android:textColor="@color/color666"android:textSize="@dimen/sp_10" /><jaygoo.widget.wlv.WaveLineViewandroid:id="@+id/waveLineView"android:layout_width="@dimen/dp_160"android:layout_height="@dimen/dp_18"android:layout_below="@id/tv_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="@dimen/dp_4"app:wlvBackgroundColor="@color/white"app:wlvFineLineWidth="@dimen/dp_0.2"app:wlvLineColor="@color/app_color_theme_5"app:wlvMoveSpeed="290"app:wlvThickLineWidth="@dimen/dp_0.5" /></RelativeLayout></RelativeLayout>

5、对话框样式

  <style name="BoxDialog" parent="@android:style/Theme.Holo.Dialog"> <!-- 是否有边框 --><item name="android:windowFrame">@null</item> <!--是否在悬浮Activity之上 --><item name="android:windowIsFloating">true</item> <!-- 标题 --><item name="android:windowNoTitle">true</item> <!--阴影 --><item name="android:windowIsTranslucent">true</item> <!--背景透明--><item name="android:windowBackground">@android:color/transparent</item> <!--可加入动画--></style>

完毕!!!

注意由于业务场景需要用到的语音播放效果库WaveLineView

 implementation 'com.github.Jay-Goo:WaveLineView:v1.0.4'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博文小调研

感谢信 很高兴认识各位盆友&#xff0c;天南地北一家人&#xff01; 无论身在行业差异&#xff0c;所处职位高低&#xff0c;工作年限长短&#xff0c;这个平台都为爱好学习的人们提供了很好的机会和进步的源动力。 博主今年自11月份开启了新的系列文章&#xff0c;每周发表6…

c MJPG

yuv格式的照片是纯yuv的数据&#xff0c;如果不告诉图片查看程序此数据流的长与宽&#xff0c;是无法显示图片的。 MJPG是由多帧jpg图片组成。jpg图片有文件头&#xff0c;里面就有必须的长&#xff0c;宽数据。jpg的图片数据是yuv压缩后的数据。所以jpg解码后的数据也是yuv&a…

容器安全是什么

容器安全是当前面临的重要挑战之一&#xff0c;但通过采取有效的应对策略&#xff0c;我们可以有效地保护容器的安全。在应对容器安全挑战时&#xff0c;我们需要综合考虑镜像安全、网络安全和数据安全等多个方面&#xff0c;并采取相应的措施来确保容器的安全性。 德迅蜂巢原…

Clion+Ubuntu(WSL)+MySQL8.0开发环境搭建

1. 下载 MySQL 源码 访问 MySQL 官方网站&#xff08;MySQL :: Download MySQL Community Server&#xff09;并下载 MySQL 8.0 的源码包&#xff08;mysql-boost-8.0.31.tar.gz&#xff09;。 2. 安装编译依赖 1&#xff09;更换镜像源 参考&#xff1a;Linux Ubuntu 修改…

java开发之个微群聊自动添加好友

请求URL&#xff1a; http://域名/addRoomMemberFriend 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRoom…

20 Go的命令行参数

概述 在上一节的内容中&#xff0c;我们介绍了Go的时间日期&#xff0c;包括&#xff1a;time包、格式化日期、日期字符串解析、计算日期差、时区操作、定时任务等。在本节中&#xff0c;我们将介绍Go的命令行参数。命令行参数在程序设计中扮演着重要的角色&#xff0c;它允许用…

4个Pycharm高效插件

大家好&#xff0c;Pycharm是Python最受欢迎的集成开发环境之一&#xff0c;它具有良好的代码助手、漂亮的主题和快捷方式&#xff0c;使编写代码变得简单快捷。话虽如此&#xff0c;开发者仍可以通过使用一些插件来提高在Pycharm中编写Python代码的效率和乐趣&#xff0c;在市…

【【FPGA 之Micro Blaze的串口中断实验】】

FPGA 之Micro Blaze的串口中断实验 我们在使用 MicroBlaze 进行嵌入式系统设计的时候&#xff0c;通常会用到 AXI Uartlite IP 核与外部设备通信。AXI UART IP 核实现了 RS-232 通讯协议&#xff0c;并使得大家可以设置串口通信相关的波特率、奇偶校验位、停止位和数据位等参数…

前端OFD文件预览(vue案例cafe-ofd)

0、提示 下面只有vue的使用示例demo &#xff0c;官文档参考 cafe-ofd - npm 其他平台可以参考 ofd - npm 官方线上demo: ofd 1、安装包 npm install cafe-ofd --save 2、引入 import cafeOfd from cafe-ofd import cafe-ofd/package/index.css Vue.use(cafeOfd) 3、使…

数据可视化工具APITable:实现强大的多维表格功能并随时随地远程访问

APITable免费开源的多维表格与可视化数据库公网远程访问 文章目录 APITable免费开源的多维表格与可视化数据库公网远程访问前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c…

kubectl系列(五)-kubectl scale 命令最佳实践

1 概述 kubectl scale命令通过调整正在运行的容器的数量来立即缩放应用程序。这是增加部署副本数量的最快、最简单的方法&#xff0c;可用于应对服务高峰以及日常维护变更。 在本文中将了解如何使用kubectl scale来扩展一个简单的Kubernetes Deployment&#xff0c;同时还将更…

kobs-ng 烧写nand中的uboot

如何获取kobs-ng 我是使用buildroot自动编译的imx-kobs&#xff0c;生成了kobs-ng可执行文件。 使用 kobs-ng 烧写 u-boot 1. flash_erase /dev/mtd0 0 0 //擦除uboot所在分区 2. 挂载 debugfs mount -t debugfs debugfs /sys/kernel/debug 如果不挂载为报以下错误&#x…

Java中的synchronized关键字

目录 1、synchronized是什么 2、synchronized的用法 synchronized可以用在方法或者代码块上&#xff0c;分别称为同步方法和同步代码块。 用法理解 3、synchronized的实现原理 ⭐synchronized锁的对比 4、synchronized的优缺点 ⭐扩展&#xff1a;synchronized 和 vola…

nvm安装管理nodejs版本

1&#xff1a;如果之前先安装了nodejs先卸载nodejs 2&#xff1a;下载nvm&#xff0c;点击下载路径https://github.com/coreybutler/nvm-windows/releases&#xff0c;选择相应环境下载&#xff0c;如下window环境下载 下载成功后&#xff0c;选择NVM安装在哪个文件目录下&…

IDEA之Eclipse Code Formatter插件的安装与使用

概述 Eclipse、Intellij idea格式化结果不同&#xff0c;之前由于没有Eclipse Code Formatter插件&#xff0c;所以公司统一用eclipse做开发&#xff0c;但是我们都知道IDEA是非常强大、也非常的方便&#xff0c;很多功能是eclipse不具备的&#xff0c;只是我们公司统一用&…

【隐私计算】VOLE (Vector Oblivious Linear Evaluation)学习笔记

近年来&#xff0c;VOLE&#xff08;向量不经意线性评估&#xff09;被用于构造各种高效安全多方计算协议&#xff0c;具有较低的通信复杂度。最近的CipherGPT则是基于VOLE对线性层进行计算。 1 VOLE总体设计 VOLE的功能如下&#xff0c;VOLE发送 Δ \Delta Δ和 b b b给send…

【论文阅读笔记】InstructDiffusion: A Generalist Modeling Interface for Vision Tasks

【论文阅读笔记】StyleAvatar3D: Leveraging Image-Text Diffusion Models for High-Fidelity 3D Avatar Generation 论文阅读笔记论文信息引言动机挑战 方法结果 关键发现相关工作1. 视觉语言基础模型2. 视觉通用模型 方法/模型视觉任务的统一说明训练数据构建网络结构 实验设…

全网最新最全面的Jmeter接口测试:jmeter模拟http请求实战

1、get请求 http://www.hnxmxit.com/ 2、带参数的get请求 微信公众号获取token请求 3、自定义头部信息的请求 百度搜索请求 https://www.baidu.com/s?wd猫 4、post请求 微信公众号添加用户标签请求 注&#xff1a;post请求中如果body中的数据为json,一定要在信息头管理器中…

编译原理头歌实验:实验1《词法分析程序设计与实现》(C语言版)

任务描述 本关任务&#xff1a;加深对词法分析器的工作过程的理解&#xff1b;加强对词法分析方法的掌握&#xff1b;能够采用一种编程语言实现简单的词法分析程序&#xff1b;能够使用自己编写的分析程序对简单的程序段进行词法分析。 相关知识 为了完成本关任务&#xff0…

Qt应用开发--国产工业开发板全志T113-i的部署教程

Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用&#xff0c;因其跨平台性和丰富的功能而备受青睐。 Qt能够为工业领域带来什么好处&#xff1a; -…