TYPE_SYSTEM_ALERT弹Dialog的问题

原创 2018年04月16日 10:55:25

需求:请求网络,弹窗(窗口不为Activity为Dialog且dialog为系统级即在任何地方都能弹窗)

由于dialog是系统级,所以要用到权限TYPE_SYSTEM_ALERT,其实能够很简单的弹窗,为了复用视图就牵扯到很多问题了。问题描述如下:

问题描述:

按照简单的思路走 第一次加载的时候,执行如下流程

//加载视图
mView = inflater.inflate(R.layout.activity_screen_trans, null);
//设置视图
 mBuilder = new AlertDialog.Builder(getApplicationContext());
mBuilder.setView(mView);
//创建视图和设置弹出窗口类型
AlertDialog dialog = mBuilder.create();
mWindow = dialog.getWindow();
mWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//展示视图
 dialog.show();

第二次加载 我希望能够复用mView这个视图,但是此时问题出现了,log抛出了这个异常throw new RuntimeException("view " + this + " being added, but" + " it already has a parent");。就是说mView在视图树中 有个父类了。

问题原因分析

原因在与dialog.show()这个地方,它大概的意思是,因为任何的dialog或者view都需要有一个DectorView,所以系统会在mView上加FrameLayoutDectorView,所以下一次复用的时候mView就会有一个父类了,所以就报错。

解决方案

现在的解决方案就是想想有没有实现remove parent之类功能的函数,baidu和google都没有结果后,快放弃这个方法了,但是觉得尽然能生成这棵树,肯定也能删除这棵树,所以准备找没有暴露出来的方法,最后找到了assignParent(ViewParent),然后用反射调用就可以了。反射注意,参数是Object[]类型。需要如下调用

Method method = View.class.getDeclaredMethod("assignParent", ViewParent.class);
method.setAccessible(true);
Object[] parameters = { null };
method.invoke(mView, parameters);

android 6.0之后 android.permission.SYSTEM_ALERT_WINDOW使用方法变动

在android6.0之前想要用service弹出对话框还蛮简单的,这是之前的方法但是改版之后因为安全的问题, android 系统觉得开发者要放这种功能需要使用者”认真”的同意,于是以后要使用弹出...
  • chenlove1
  • chenlove1
  • 2016-07-27 16:48:46
  • 14277

Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

方案一、 1、在开发中有时会用到全局弹出对话框但必须在manifest中申请权限:2、创建Dialog AlertDialog.Builder builder=new AlertDia...
  • u011928958
  • u011928958
  • 2017-05-27 12:30:59
  • 5750

android 7.1.1下android.permission.SYSTEM_ALERT_WINDOW改动及BUG

参考文章: 1、http://chen-wei.me/2016/11/10/android-permission-best-practice/ 2、http://blog.csdn.net/lmj...
  • xiexiangyu92
  • xiexiangyu92
  • 2017-10-16 20:12:31
  • 762

android M SYSTEM_ALERT_WINDOW权限问题

public class ForceOfflineReceiver extends BroadcastReceiver { @Override public void onReceive...
  • michael_yt
  • michael_yt
  • 2016-10-18 17:22:29
  • 1060

Receiver里面启动dialog引发的一系列错误解决(SYSTEM_ALERT_WINDOW)

首先,在receiver中show出dialog的做法: @Override public void onReceive(final Context context, Intent intent) ...
  • u012504392
  • u012504392
  • 2016-11-02 19:36:57
  • 1821

随笔:关于权限android.permission.SYSTEM_ALERT_WINDOW

我查了网上权限的意思:android.permission.SYSTEM_ALERT_WINDOW允许一个程序打开窗口使用TYPE_SYSTEM_ALERT,显示在其他所有程序的顶层。 对这个说法有...
  • u014716362
  • u014716362
  • 2016-02-02 12:16:04
  • 5985

android system alter window实现系统提示框

android 实现系统提示框 实际工作中,特别是定制设备和系统,经常会需要弹出些系统级别的提示框,如程序的后台升级下载,完成进度等等,在不影响其他程序的正常使用的同时进行有效的提示,提示级别为系统...
  • u011403718
  • u011403718
  • 2016-08-30 09:11:34
  • 1421

Android6.0 创建TYPE_SYSTEM_ALERT级别的弹出框方法

突然发现在android6之前的版本都是可以弹出系统级别的dialog, 但是到了6.0就不行了, 搜索发现官方文档有下面说明: Allows an app to create windows u...
  • chuyouyinghe
  • chuyouyinghe
  • 2017-05-18 16:42:38
  • 671

Android6.0 创建TYPE_SYSTEM_ALERT级别的弹出框方法

突然发现在android6之前的版本都是可以弹出系统级别的dialog, 但是到了6.0就不行了, 搜索发现官方文档有下面说明: Allows an app to create windows u...
  • sange77
  • sange77
  • 2017-02-08 15:26:32
  • 2227

Android Dialog设置TYPE_SYSTEM_ALERT 小米,魅族手机不能显示问题

在对话框初始的时候,设置  Java代码   mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TY...
  • qq_28909387
  • qq_28909387
  • 2017-10-30 11:16:32
  • 335
收藏助手
不良信息举报
您举报文章:TYPE_SYSTEM_ALERT弹Dialog的问题
举报原因:
原因补充:

(最多只允许输入30个字)