首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么Android会在扩展活动中泄漏窗口,用于在超级活动中创建的对话框,甚至取消调用?

为什么Android会在扩展活动中泄漏窗口,用于在超级活动中创建的对话框,甚至取消调用?
EN

Stack Overflow用户
提问于 2017-01-13 14:08:27
回答 2查看 298关注 0票数 0

我正在做一个Android项目。我有扩展AppCompatActivityBaseActivity,然后我有另一个扩展BaseActivity的activity StartActivity。我在BaseActivity中有我要调用的AlertDialog。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

        alertDialog.setCancelable(false);
        alertDialog.setTitle(getResources().getString(R.string.title_attention));
        alertDialog.setMessage(getResources().getString(R.string.message_permission_denied));

        alertDialog.setPositiveButton(getResources().getString(R.string.button_settings), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                        Uri.parse("package:" + getApplicationContext().getPackageName()));

                myAppSettings.addCategory(Intent.CATEGORY_DEFAULT);
                myAppSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                getApplicationContext().startActivity(myAppSettings);
            }
        });
        alertDialog.setNegativeButton(getResources().getString(R.string.button_exit),
                new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                aDialog.dismiss();
                finish();

            }
        });
        aDialog = alertDialog.create();

        aDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                aDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorButtonPositive));
                aDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorButtonNegative));
            }
        });

        if (!aDialog.isShowing())
            aDialog.show();

而且我还覆盖了BaseActivity中的onDestroy方法,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
    protected void onDestroy() {
super.onDestroy();
        try{
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (aDialog != null && aDialog.isShowing()) {
                        aDialog.dismiss();
                    }
                }
            });
        }catch (Exception e){
            new ErrorPrinter(e.toString());
        }
    }

StackTrace/错误日志,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
01-13 08:38:59.928 5501-5501/com.company.android E/WindowManager: android.view.WindowLeaked: Activity com.company.android.activities.StartActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{7a59bc1 V.E...... R......D 0,0-1160,413} that was originally added here
                                                                                        at android.view.ViewRootImpl.<init>(ViewRootImpl.java:368)
                                                                                        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299)
                                                                                        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
                                                                                        at android.app.Dialog.show(Dialog.java:319)
                                                                                        at com.company.android.activities.BaseActivity.permissionDenied(BaseActivity.java:216)
                                                                                        at com.company.android.activities.BaseActivity.onRequestPermissionsResult(BaseActivity.java:160)
                                                                                        at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6582)
                                                                                        at android.app.Activity.dispatchActivityResult(Activity.java:6460)
                                                                                        at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
                                                                                        at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
                                                                                        at android.app.ActivityThread.-wrap16(ActivityThread.java)
                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                        at android.os.Looper.loop(Looper.java:148)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

但是我在安卓监视器中得到了异常,StartActivity已经泄漏了最初添加在这里的窗口。谁能告诉我怎样才能解决这个错误?

我扩展到BaseActivity的原因是我想为所有的活动使用一些功能,这样我就可以一次编写或删除代码,它将在所有的活动中使用。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-01-13 14:18:45

这是因为当活动暂停时,它将被垃圾回收,但由于对话框仍未关闭,警报对话框仍有对该活动的引用。

您需要在BaseActivity中覆盖onPause()和onStop():

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
  public void onPause() {
      super.onPause();

      if(aDialog != null)
          aDialog.dismiss();
  }

@Override
protected void onStop() {
    super.onStop();

    if(aDialog != null)
        aDialog.dismiss();
}

在启动另一个活动时,还要在alertDialog.setPositiveButton()中的此行之后关闭对话框并完成活动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getApplicationContext().startActivity(myAppSettings);
aDialog.dismiss();
finish();  
票数 0
EN

Stack Overflow用户

发布于 2017-01-13 15:02:11

我必须重写finish()方法,并通过获取进程id来终止我的进程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
    public void finish() {
        super.finish();
        android.os.Process.killProcess(android.os.Process.myPid());
    }

感谢大家的帮助和支持!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41636442

复制
相关文章
Android 10 中身体活动数据的隐私保护
Android 10 在数据可控性方面又作了进一步优化,提高了用户对此类个人数据的控制权,而其中的一项关键变更则会对应用的活动监测和数据检索方式造成影响,要求 Android 应用依照新规定来监测用户的身体活动并从 Android 传感器 API 和 Google Fit 平台检索数据。
Android 开发者
2019/12/03
1.6K0
Android - 使用Intent在活动之间穿梭
Intent有多个构造函数的重载,其中一个 Intent(Context packageContext,Class<?>cls)
博博1998
2022/04/25
5290
Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui
参考链接:Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui: https://blog.csdn.net/bailichun19901111/article/details/105042145
forxtz
2020/10/10
8.4K0
Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui
在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService
全栈程序员站长
2022/07/05
1.9K0
在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService
欢醉
2018/01/22
2.3K0
vivo 悟空活动中台 - H5 活动加载优化
通过之前悟空活动中台系列文章,大家对微组件、动态布局等技术方案有了一定的了解。本篇我们带大家了解下悟空H5专题性能优化之路。
2020labs小助手
2020/08/03
1.4K0
谈一谈规则引擎在活动系统中的落地
本文从 “为什么需要规则引擎” “规则引擎的定义” “规则引擎在营销活动系统中的落地” “规则引擎平台内部架构” “现有的规则引擎” 来描述。
邹志全
2021/05/14
2.7K1
测试活动中的那些文档们
不知从何时起测试过程中,写得最多的文档就是测试用例,有时连测试报告都免了,毕竟测试任务真的很紧,时间都拿熟悉执行测试了,哪里有时间写测试文档啊,再说我们也不爱写这些文档啊,哈哈。。。
王豆豆
2020/07/24
1.5K0
测试活动中的那些文档们
flashfxp编辑文件显示活动编辑的取消办法
我一直在使用的是国产的8UFTP,但是最近win10系统貌似有点不和谐,编辑文件上传的时候会有一秒“未响应”的卡顿情况,所以有些别扭,又不想做回win7,所以就想起了比较强大的flashfxp。
李洋博客
2021/06/16
1.5K0
UML学习-活动图创建
活动图(Activity Diagram)可以实现对系统动态行为的建模,主要是将用例细化,即用例内部的细节可以以活动图的方式描述。活动图描述活动的顺序,主要表活动之间的控制流,是内部处理驱动的流程,在
水击三千
2018/02/27
1.8K0
UML学习-活动图创建
TienChin 活动管理-工程创建
工程模块的创建,与之前创建渠道管理一样的,所以这里就不贴图带着大家一起动手进行了,表结构我已经给到大家了,这里我只贴一下代码生成器的代码部分即可。
程序员 NEO
2023/10/12
2010
TienChin 活动管理-工程创建
我认知中的营销活动及其系统
这是一篇大长文,是对我上份工作的总结,对主要工作内容的总结、也是对 “2020技术驿站” 补交的作业,望前东家前团队能更好,也祝愿自己在新的环境中能继续满心欢喜的前行。
邹志全
2020/06/16
5.6K2
我认知中的营销活动及其系统
Android-活动的最佳实践
知晓当前在哪一个活动 工作当中可能接手一份别人的代码,当需要在某个界面修改东西的时候,却找不到这个界面对应的是哪个活动。 新建一个BaseActivity类,右击包名,New,Java Class,输入BaseActivity。 只写一个普通Java类就可以了,并让BaseActivity继承AppCompatActivity,并重写onCreate()方法。
博博1998
2022/04/25
5850
Android-活动的最佳实践
闲谈Android中的内存泄漏
在长久以来的 Android 开发过程中,内存泄漏一直是一个比较头疼的问题。内存泄漏会导致应用卡顿,用户体验不佳,甚至会造成应用崩溃的严重后果。所以如何科学地进行内存管理一直是大家探讨的话题,从一开始主动使用 MAT 分析 hprof 文件,到后来 LeakCanary “被动”的接收内存泄漏消息。应用中发现内存泄漏的手段越来越多了,操作也越来越便捷,但内存泄漏的问题还是不能轻易忽视的,提高应用的体验和质量也是迫在眉睫。
俞其荣
2021/11/24
7870
闲谈Android中的内存泄漏
闲谈Android中的内存泄漏
在长久以来的 Android 开发过程中,内存泄漏一直是一个比较头疼的问题。内存泄漏会导致应用卡顿,用户体验不佳,甚至会造成应用崩溃的严重后果。所以如何科学地进行内存管理一直是大家探讨的话题,从一开始主动使用 MAT 分析 hprof 文件,到后来 LeakCanary “被动”的接收内存泄漏消息。应用中发现内存泄漏的手段越来越多了,操作也越来越便捷,但内存泄漏的问题还是不能轻易忽视的,提高应用的体验和质量也是迫在眉睫。
俞其荣
2019/07/09
1.4K0
android-活动最佳实践
创建一个BaseActivity 类继承Activity 在onCreate 中输出类名
tea9
2022/07/16
2290
Android-探究活动(一)
setContentView() 给当前活动加载一个布局 例:setContentView(R.layout.first_layout);
博博1998
2022/04/25
3580
Android-活动的启动模式
在实际项目中我们应该根据特定需求为每个活动指定恰当的启动模式, 启动模式一共有4种,standard,singleTop,singleTask,singleInstance,可以在AndroidManifest.xml中通过标签指定android:launchMode属性来选择启动模式。 standard standard是活动默认的启动模式,在standard模式下,每当启动一个新的活动,他就会在返回栈中入栈,并处于栈顶位置,对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动活动都会创建该活动的一个新的实例。
博博1998
2022/04/25
6880
Android-活动的启动模式
探究Android活动的小技巧
当我们在查看别人的代码的时候可能不能第一眼就发现首次的活动是哪一个,我们可以通过以下的方法来找出当前的主活动是哪一个:
Dream城堡
2018/12/13
5430
活动预告 | RTSCon 2022正在报名中
初雪将至,万众期待的一年一度RTSCon再次来袭,本次RTSCon 2022由RTS社区和LiveVideoStack社区联合出品。本次大会主题围绕“实时通信与价值赋能”开展,届时我们为大家准备了业内大咖主题演讲以及圆桌会议两个模块,欢迎报名参会收看。 RTS社区是以实时音视频通信为主的技术社区,RTSCon是以实时音视频通信技术交流为主的技术交流大会。LiveVideoStack社区是一个专注音视频技术的垂直社区和平台,自2017年创立以来不断探索如何更好地推动多媒体技术生态更健康的发展。 RTS的前身
LiveVideoStack
2023/04/04
4830
活动预告 | RTSCon 2022正在报名中

相似问题

Android活动已泄漏窗口

21

活动已泄漏窗口,对话框

10

facebook活动中的泄漏窗口

13

android:“神探夏洛克”活动警报对话框的窗口泄漏

12

活动中的Android内存泄漏

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文