Android 全局Dialog

article/2025/8/27 19:45:30

前沿

android 弹窗好几种,全局弹窗是什么?和普通Dialog(必须依附activity上下文的弹窗)有什么区别?
逛技术blog发现【全局dialog】这个名词,之前用FragmentDialog,自定义dialog。以及dialog的模态窗口,dialog非模态窗口。全局弹窗dialog比较新鲜。(对于我来说)。分享如下

下定义: 全局弹窗不依赖activity上下文的弹窗。及时关闭app,同样可以浮在系统桌面上。

实现全局弹窗

方式有两种:在服务中弹窗,使用windowManager进行弹窗设置

方式1:开启服务,在service中进行,service中来弹出dialog。用new Dialog().show()的话,会抛异常。然后通过看源码。发现,dialog可以是可是设置成系统的alert的。

  mDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));

清单文件进行声明必要的权限 api<23

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

UML 类图关系

这里写图片描述

简单介绍下,后面会附上源码下载地址

1.使用系统api,observer,Observable 进行showdialog的通知。具体使用方案多种(接口回调方式,强引用server)能实现需求并且不出bug都是好方案。这里使用observer,Observable进行类间解耦。
2.服务的开启,startService(this,GlobalService.class),清单文件声明必要的权限,service声明都是必不可少的。
3. 系统api,observer,Observable的使用需要进行观察者的注册,dialogObservable.addObserver(new GlobalService())

package com.tseng.alldilaog;import android.app.Application;
import android.content.Context;import com.tseng.alldilaog.dialog.DialogObservable;
import com.tseng.alldilaog.dialog.GlobalService;/*** Author: yangweichao* Date:   2018/8/14 下午3:41* Description:*/public class MyApp extends Application {private static Context mContext;private static DialogObservable dialogObservable;@Overridepublic void onCreate() {super.onCreate();mContext = getApplicationContext();dialogObservable = new DialogObservable();dialogObservable.addObserver(new GlobalService());}public static Context  getmContext() {return mContext;}public static void showDialog(String msg) {dialogObservable.showDialog(msg);}
}

4.使用方法,全局直接调用弹窗方法

public void fff(View view) {MyApp.showDialog("你好啊");}

方式2

采用 windowManager方式,这里不进行说明,请看引用部分 ⬇️ 引用


特别注意:

android 版本迭代过程中需要处理不同版本兼容,否则,崩溃是免不了的

在api >=23中加入运行时权限检查,并把 SYSTEM_ALERT_WINDOW废弃,替换为SYSTEM_OVERLAY_WINDOW,所以在使用全局弹窗入口进行权限检查。

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
    //兼容api23版本if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (Settings.canDrawOverlays(MainActivity.this)) {Intent intent = new Intent(MainActivity.this, GlobalService.class);startService(intent);} else {//若没有权限,提示获取.Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);Toast.makeText(MainActivity.this, "需要取得权限以使用悬浮窗", Toast.LENGTH_SHORT).show();startActivity(intent);}} else {//SDK在23以下,不用管.Intent intent = new Intent(MainActivity.this, GlobalService.class);startService(intent);finish();}

不检查权限会报如下异常:

rocess: com.tseng.alldilaog, PID: 824android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@7795399 -- permission denied for window type 2003at android.view.ViewRootImpl.setView(ViewRootImpl.java:928)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:97)at android.app.Dialog.show(Dialog.java:419)at com.tseng.alldilaog.dialog.MyService$1.dispatchMessage(MyService.java:28)at android.os.Looper.loop(Looper.java:154)at android.app.ActivityThread.main(ActivityThread.java:6682)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1534)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1424)

在dialog,show()的地方同样添加兼容代码,防止异常发生。

该方法 update(),来自Observable,需要进行复写,处理dialog ui展示@Overridepublic void update(Observable observable, Object data) {String msg = (String) data;if (msg != null) {if (mDialog == null) {mDialog = new Dialog(MyApp.getmContext());mDialog.setContentView(R.layout.show_dialog);}if (mDialog != null && !mDialog.isShowing()) {mDialog.setTitle(msg);// 加入系统服务
//                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//6.0
//                    mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
//                } else {
//                    mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//                }//8.0系统加强后台管理,禁止在其他应用和窗口弹提醒弹窗,如果要弹,必须使用TYPE_APPLICATION_OVERLAYif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {mDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));}else {mDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));}mDialog.show();}} else {if (mDialog != null) {mDialog.cancel();mDialog = null;}}}

android 8.0 对悬浮窗的的优化

Android8.0悬浮窗权限

demo下载: https://github.com/yatou252303/tseng/tree/master

最后,希望此篇博客对大家有所帮助,欢迎提出问题及建议共同探讨,如有兴趣可以关注我的博客,谢谢!

参考:

https://www.jianshu.com/p/634cd056b90c Android悬浮窗TYPE_TOAST小结: 源码分析
https://www.jianshu.com/u/38373cf49077 Android 8.0完美适配全局dialog 悬浮窗弹出
https://www.cnblogs.com/lizhanqi/p/8214319.html permission denied for window type 2003
https://blog.csdn.net/pangzaifei/article/details/43155997 全手机弹出的dialog和观察者设计模式


http://chatgpt.dhexx.cn/article/5q5s0qM0.shtml

相关文章

Android开发dialog内存泄露,Android中导致内存泄漏的竟然是它----Dialog

一. 内存泄漏的 Bug 猛增 最近在 App 进行 mokey 测试的时候检测到一些内存泄漏问题。在前天的测试中,楼主一瞬间收到了4个这样的 Bug 单,瞬间心理无比纠结,真有千万只羊驼向我奔来。 登录页面出现内存泄漏??!!楼主的代码是如此的***而无懈可击,这么可能出现这么多泄漏的…

dialog.setOnDismissListener(null)过程分析

前提 为解决DialogFragment的内存泄漏&#xff0c;使用了此篇博客的处理方法 DialogFragment 内存泄露&#xff0c;简单说就是给 dialog 设置 getDialog().setOnCancelListener(null); getDialog().setOnDismissListener(null);但发现了一个问题&#xff0c;当用户返回Activi…

深入分析Android中Dialog

在Android中,Dialog是一个非常重要的UI, 它可以方便的给用户提示,用最简洁的方式向用户展示信息, 以下的图片是Dialog的一个整体架构&#xff0c;通过它&#xff0c;可以总体对Dialog有一个很清晰的认识. 从这张图中可以看到&#xff0c;Dialog为父类, 其下有最重要的&#xf…

android自定义dialog去除title,Android 自定义Dialog去除title导航栏的解决方法

Android 自定义Dialog去除title导航栏的解决方法 如下所示: Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); 以上这篇Android 自定义Dialog去除title导航栏的解决方法就是小编分享给大家的全部内…

android常见的dialog的使用及认识

介绍 在实际开发过程中 , 我们难免要经常使用提示框 (dialog), 根据不同的场景使用不同的样式的提示框(dialog). androd提供了丰富的dialog函数 , 本文将介绍在实际开发中经常使用的对话框, 包括普通对话框 , 列表对话框 , 单选对话框 , 多选对话框 , 等待对话框, 进度条对话框…

ABAP屏幕设计Dialog

目录 一、概览 1.屏幕 2.程序组织 3.屏幕定义和维护 用途&#xff1a; 组成&#xff1a; Dialog的屏幕执行过程&#xff1a; 属性&#xff1a; 创建&#xff1a; 4.屏幕属性的动态修改 5.屏幕序列 二、Screen编程实例 1.Hello World屏幕编程 建立程序&#xff1a; 设计…

Android Dialog 源码研究

Android Dialog 源码研究 在阅读Dialog源代码之前,我给自己提出了4个问题,带着这4个问题的疑问,我才开始看源码,这样的好处能让阅读中有了侧重点,往往能更快的理解某些代码的意图,这也正是为什么总说提出问题本身,要比解决问题困难。 我下面要思考的4个问题是: Dialo…

android 判断dialog,Android 7.0经验谈:Dialog不显示之迷

最近遇到个怪问题,在其他手机上都能正常的显示Dialog,但是在Android 7.0的手机上只能显示Dialog的半透明背景,无法显示Dialog的内容。 用图给大家展示一个遇到的现象,正常时应该是这个样子的: 而我们遇到的情况如下,更坏的是如果我们设置Dialog不能点击空白处取消(dismis…

Android窗口设计之Dialog、PopupWindow、系统窗口的实现

窗口设计之Dialog、PopupWindow、系统窗口的实现 Android应用程序窗口设计系列博客: Android应用程序窗口设计之Window及WindowManager的创建 Android应用程序窗口设计之setContentView布局加载的实现 普法Android的Token前世今生以及在APP,AMS,WMS之间传递 Android应用程序窗口…

理解Android中Dialog

文章收藏的好句子&#xff1a;你能走多远、爬多高&#xff0c;不仅取决于你自身的力量&#xff0c;还取决于周围人带动的力量。 PS&#xff1a;本文是基于 Android Api 26 来分析源码的。 1、Dialog 的 Window 是在哪里创建的&#xff1f; Dialog 的 Window 是在什么地方创建的…

Android之Dialog分析

Android之Dialog分析 以Dialog为引导&#xff0c;Android的弹出式消息一共是三种&#xff08;据我所知&#xff09;&#xff1a;Dialog&#xff0c;tocast&#xff0c;notification 其三种弹出式消息各有所长。今天重点是分析其中的Dialog。Android的Dialog是android界面编程的…

Android开发dialog内存泄露,Dialog引发的内存泄漏

8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本文是本人对于 LeakCanary 团队的一篇分析内存泄漏的文章的意译。水平有限,如有不够准确之处,敬请包涵。 主旨:在Lollipop之前的版本,Dialog可能导致内存泄漏。 引言 LeakCanary 提示存在内…

android源码分析-Dialog

今天给大家介绍android -Dialog源码分析 Dialog 是所有对话框的基类&#xff0c;例如AlertDialog&#xff0c;我们要深入了解指导Dialog的用法&#xff0c;逻辑&#xff0c;必须要把Dilaog弄清楚&#xff0c;下面首先我们来看下Google对Dialog的类描述&#xff1a;/**Base clas…

Dialog源码分析

1, 概述 Dialog(对话框)不仅可以显示信息,还可以和Activity界面进行交互,这种交互是阻塞式的. 继承Dialog的类有好几种,主要以AlertDialog为例来分析一下具体的原理。 2 实现 Dialog依附于Activity来实现,一般在acitivty中显示,因为Dialog的交互是阻塞式的,所以最好另开一线…

爬虫为什么会使用到HTTP代理?

在进行网页爬虫的时候使用HTTP代理&#xff0c;可以进行匿名抓取网页信息&#xff0c;爬取大数据等使用方向。HTTP代理我们很了解&#xff0c;但是你有了解过HTTP协议是什么吗&#xff1f; HTTP协议即超文本传输协议&#xff0c;是Internet上信息传输时使用最为广泛的一种简单…

爬虫笔记——全局代理下的requests写法

当PC挂了全局代理的时候&#xff0c;如果你的requests还像下面写的话&#xff0c;大概率会报错&#xff1a; 正确的写法是&#xff1a;

抓包:Android不走代理的请求

测试用例 测试应用有两个按钮&#xff0c;分别用 HttpURLConnection 和 Okhttp3 请求 https://www.baidu.com/。注意&#xff1a;两个请求都加入了 Proxy.NO_PROXY。 //HttpURLConnection请求https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel13812371237 public …

python爬虫——selenium+chrome使用代理

先看下本文中的知识点&#xff1a; python selenium库安装chrome webdirver的下载安装seleniumchrome使用代理进阶学习 搭建开发环境&#xff1a; selenium库chrome webdirver谷歌浏览器 >7.9 PS&#xff1a;安装了的同学可以跳过了接着下一步&#xff0c;没安装的同学跟…

python 爬虫 客户端_python爬虫

爬虫简介 什么是爬虫&#xff1f; 爬虫&#xff1a;就是抓取网页数据的程序。 HTTP和HTTPS HTTP协议(HyperText Transfer Protocol&#xff0c;超文本传输协议)&#xff1a;是一种发布和接收 HTML页面的方法。 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单…

爬虫从入门到精通(7) | 常见反爬-代理IP的使用

目录 一、 为什么要使用代理IP&#xff1f; 二、代理IP的原理 三、代理IP的作用 四、代理IP的分类 ​ 1.根据代理的协议区分 2.根据匿名程度区分 五、在requests模块中如何设置代理 一、 为什么要使用代理IP&#xff1f; 使用自己本地的IP 利用爬虫技术获取某个网站信息的时…