展开

关键词

Android单一例全局可调用网络加载弹窗

但是际做起来之后发,因为单例的原因,你的弹窗只能在第一次创建这个单例的activity中显示出来。 后来把思路又回到起点,需要两个点,一:全局可调用。二:单一例。 这时又会出新的问题,如果在单例中去开启这个activity,那么就会有很多dialog对象,违反初衷,如果在单例中创建dialog,那么开启activity的时候又会有很多intent对象,得不偿失。 解决方法,创建两个单例,保证intent对象和dialog对象都保持唯一。际测试发,第一次可以正常显示,第二次就会崩溃。原因:当activity被销毁,又重新创建的时候,上下文会改变。 直接把dialog的布局写在activity里不行吗?当外部去创建这个activity的时候直接播放动画,同时提供一个暴露给外部的关闭方法。而且这样也能用单例保证这个activity例的单一性。

30620

Dialog 对应的 Context 必须是 Activity吗?

后来发我的回答确错了,于是通过每日一问分享给大家。于是有了本文,我负责被打脸,小缘负责解答,我反正不会被打脸第二次了,希望大家也能更清晰的认识这一块。 问题在我们的印象里,如果构造一个 Dialog 传入一个非 Activiy 的 context,则可能会出 bad token exception。 今天我们就来彻底搞清楚这一块,问题来了:1、为什么传入一个非 Activity 的 context 会出错误?2、传入的 context 一定要是 Activity 吗? 到了WMS那边会根据这个Activity的Token来找到对应的ActivityRecord例(其是根据Token来查找对应的容器),然后把Dialog对应的WindowState添加到ActivityRecord 的意思):(试了好多办法,一张完整的图都没法让大家在手机上看清,于是我干了成两半)image.pngimage.png2.在来回答第一问:为什么使用非Activity来创建并弹出Dialog,有时会发生

46500
  • 广告
    关闭

    腾讯云前端性能优化大赛

    首屏耗时优化比拼,赢千元大奖

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android:源码解析 Dialog的窗口机制

    属于 Activity,所以** DialogActivity 共用一个 WindowManager 对象**步骤2:获得 Activity 的WindowManager对象后,Dialog 又新建了一个 对象时过程类似于Activity,所以有一种自定义Dialog布局的方式就是重写Dialog的onCreate方法,使用setContentView传入布局,类似于 Activity。 步骤4:由于DialogActivity 共用一个 WindowManager 对象,所以ActivityDialog共用同一个mAppToken值(只是DialogActivity的Window dismissDialog()void dismissDialog() { ... mWindowManager.removeViewImmediate(mDecor);}mWindowManager 际上是 WindowManagerImpl 的例,所以这里的 removeViewImmediate()就是 WindowManagerImpl 中移除 View 的方法,跟Activity 窗口销毁过程

    47820

    【云+社区年度征文】探究 | 如何捕获一个 Activity页面上所有的点击行为

    前言 最近发一个有趣的问题:如何捕获一个Activity页面上所有的点击行为。 然后获取Dialog自己的DecorView对象,并通过addView方法添加到WindowManager对象中,Dialog到屏幕上。 因此我们得知,DialogActivity但是所处的Window不一样,也就是所在的父View——DecorView也是不一样的,所以在Dialog之后,点击屏幕上的按钮,是从Dialog自己的DecorView e.printStackTrace() } } catch (e: NoSuchMethodException) { e.printStackTrace() } } 等我满意的去运行项目的时候,又被无情的扇了一巴掌 参考 wanAndroid Android应用ActivityDialog、PopWindow、Toast窗口添加机制及源码分析 反思|Android 事件分发机制的设计与 源码 PageClickMonitor

    34490

    Android 拦截返回键事件的例详解

    setOnKeyListener()方法原型为:public void setOnKeyListener(final OnKeyListener onKeyListener);此方法有一个参数,参数需要 多个拦截事件的冲突与选择目前在ActivityDialog和EditText中都可以成功设置拦截事件。如果多个对象设置了拦截事件。则事件只会分发到一个对象上。 通过验得到如下结论: 1、Dialog优先级最高,如果有一个ActivityActivity中弹出一个DialogDialog中有一个EditText,在ActivityDialog和EditText 2、Activity优先级次于Dialog,但高于EditText,如果有一个ActivityActivity中有一个EditText,在Activity和EditText中都设置监听,只有Activity 当卡顿结束后就出多次返回的象。为了避免这种情况出,可以在拦截返回键的函数中增加时间限制。即如果本次返回事件距离上次处理时间过段,则不处理本次事件。直接return true;消费此次事件。

    68520

    你还在使用Dialog?赶紧把DialogFragment用起来

    在DialogFragment未哇哇坠地之前,我们一般用AlertDialog和Dialog来创建对话框。在,谷歌官方不建议直接使用Dialog创建对话框。 Dialog控件是不属于Activity管理范围,所以没有必要在Activity写一大坨关于Dialog的代码,应该将其抽取出来。 03 用法继承DialogFragment类,然后必须onCreateView(LayoutInflater, ViewGroup, Bundle)或者onCreateDialog(Bundle)方法 04 与Activity(Framgent)交互以上面创建Alert Dialog为例子继续讲解。 最简单、最方便的方法是利用Java的接口回调机制,在DialogFragment类中定义一个回调接口, Activity(Framgent)该接口。 在DialogFragment类中?

    59830

    Android项目战(七):Dialog主题Activity自定义对话框效果

    想必大家都用过Dialog主题的Activity吧,用它来显示自定义对话框效果绝对是一个非常不错的选择。 即把activity交互界面以Dialog的形式展出来,Dialog主题的Activity大小将以内容的宽高来决定 可以看到设置为Theme.Dialog主题的activity显示效果,是类似对话框的形式显示出来的 方法就是 自定义一个style ,在resstyles.xml 文件中 @android:colortransparent 设置dialog的背景,此处为系统给定的透明值 @null Dialog的 windowFrame框为无 true         是否显示标题 true 是否浮activity之上 true 是否半透明 @null 是否有覆盖 @android:styleAnimation.Dialog 设置Activity方式 true 背景是否模糊显示 布局文件不变,再更改清单配置文件: 主题设置为我们自定义的style

    59060

    Android项目战(七):Dialog主题Activity自定义对话框效果

    想必大家都用过Dialog主题的Activity吧,用它来显示自定义对话框效果绝对是一个非常不错的选择。 即把activity交互界面以Dialog的形式展出来,Dialog主题的Activity大小将以内容的宽高来决定 可以看到设置为Theme.Dialog主题的activity显示效果,是类似对话框的形式显示出来的 方法就是 自定义一个style ,在resstyles.xml 文件中 @android:colortransparent 设置dialog的背景,此处为系统给定的透明值 @null Dialog的 windowFrame框为无 true         是否显示标题 true 是否浮activity之上 true 是否半透明 @null 是否有覆盖 @android:styleAnimation.Dialog 设置Activity方式 true 背景是否模糊显示 布局文件不变,再更改清单配置文件: 主题设置为我们自定义的style

    1.8K80

    android推荐使用dialogFrament而不是alertDialog

    上面会通过例子展示这些好处~使用DialogFragment至少需要onCreateView或者onCreateDIalog方法。 可以看到通过重写onCreateDialog同样可以创建对话框,效果还是很nice的。 MainActivity中需要我们的接口LoginInputListener,我们的方法,就可以当用户点击登陆时,获得我们的帐号密码了:c)  MainActivity  package com.example.zhy_dialogfragment 这种效果的对话框,只能通过重写onCreateView。下面我们利用上面的EditNameDialogFragment来显示。 而通过DialogFragment的对话框则可以完全不必考虑旋转的问题。

    73750

    用kotlin打造简化版本的ButterKnife

    _ 其这个库更加轻量级只做了几个最常用的注解,并且它是完全基于Kotlin进行开发的。 用于在Activity、Fragment、View、Dialog中进入注入。injectview-annotations:java library,用于存放各个注解,比如@InjectView。 中使用注解 * @param dialog * * @return * @JvmStatic fun injectInto(dialog: Dialog) { inject(dialog, dialogActivityDialog用法相似,在Fragment中用法有一点区别。 else { AsyncTaskExecutor.executeAsyncTask(new AddCommentTask(showDialog(mContext))); } } .... }总结:它只

    53330

    Android窗口管理分析(3):窗口分组及Z-order的确定总结

    ,只不过DialogActivity属于同一个分组。 之前说过ActivityDialog属于同一分组,在就来看一下ActivityDialog的token是如何复用的,这里的复用分为APP端及WMS服务端,关于窗口的添加流程之前已经分析过,这里只跟随窗口 到这一步,Activity已经准备完毕,剩下的就是在resume中通过addView将窗口添加到到WMS,具体在ActivityThread的handleResumeActivity函数中: final 窗口的Z次序管理:窗口的分配序号、次序调整等虽然我们看到的手机屏幕只是一个二维平面X*Y,但其Android系统是有隐形的Z坐标轴的,其方向与手机屏幕垂直,与我们的平行,所以并不能感知到。? 在WMS中窗口被抽象成WindowState,因此WindowState内部一定有属性来标志这个窗口的Z-order,也确如此,WindowState采用三个个int值mBaseLayer+ mSubLayer

    99150

    Fab and Dialog Morphing Animation

    Fab and Dialog Morphing Animation on Android. 最近在读Plaid的源码,发fab和dialog之间切换的动画效果好舒服,于是就研究了下,将其从Plaid项目中抽离出来,然后再改进了些代码,更加方便易懂,也更加简单易用。效果如下,项目源码地址? 原理分析1.在前面的《Android群英传》的读书笔记中提到过Activity共享元素过渡动画的方式共享元素过渡动画:一个共享元素过渡动画决定两个Activity之间的过渡怎么共享它们的视图,包括了 2.源码中的Dialog际上是Activity,并设置了android:windowIsTranslucent为true,所以从fab到dialog的动画效果际上是Activity的过渡动画。 请看下面的代码:** * MorphTransition扩展自ChangeBounds(共享元素的动画的一种),它在原有动画基础上添加了color和cornerRadius的动画效果,这个类际上是整合了

    22720

    Window刨根问底

    首先,它是一个窗口,是Android中唯一的展示视图的中介,所有的视图都是通过Window来呈的,无论是ActivityDialog或Toast,他们的视图都是附加到WIndow上的,所以Window Window是一个抽象类,他的具体就是PhoneWindow。 Window的具体在WindowManagerService中,但是创建Window或者访问Window的操作都需要WindowManager。 其次,会通过WindowSession进行一次IPC调用,交给到WMS来Window的添加。 然后获取Dialog自己的DecorView对象,并通过addView方法添加到WindowManager对象中,Dialog到屏幕上。

    14030

    三句代码创建全屏Dialog或者DialogFragment:带你从源码角度全屏Dialog

    Dialog是APP开发中常用的控件,同Activity类似,拥有独立的Window窗口,但是DialogActivity还是有一定区别的,最明显的就是:默认情况下Dialog不是全屏的,所以布局不如 全屏Dialog全屏Dialog方法这里对象分为两种,一种是针对传统的Dialog,另一种是针对DialogFragment(推荐),方法也分为两种一种是利用代码,另一种是利用主题样式Theme 来。 针对DialogFragment的方式 Android比较推荐采用DialogFragment对话框,它完全能够Dialog的所有需求,并且还能复用Fragment的生命周期管理,被后台杀死后还能自动恢复 全屏Dialog原理针对以下三个属性一步步分析。

    1.4K40

    练习PopupWindow对话框

    练习使用Dialog习对话框package com.example.tsh; import android.app.Activity;import android.app.Dialog;import 对话框 Dialog dialog=new Dialog(this,R.style.Theme_Tsh_Dialog); dialog.setContentView(R.layout.activity_two ); dialog.show(); }}styles.xml @null 练习使用PopupWindow对话框package com.example.tsh; import android.app.Activity 对话框 Dialog dialog=new Dialog(this,R.style.Theme_Tsh_Dialog); dialog.setContentView(R.layout.activity_two ); dialog.show(); 使用PopupWindow对话框 Button dropDown=(Button) findViewById(R.id.bt_dropdown); dropDown.setOnClickListener

    21830

    自适应软键盘的Dialog以及监听软键盘弹起

    ,主要是对软键盘操作的,主要有以下属性:stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置stateUnchanged:当这个activity时,软键盘将一直保持在上一个 毕竟我们没有清单文件来配置Dialog的属性。其,在清单中配置的属性本质也是告诉当前界面对软键盘这种情况的处理。 回到mCallback.onWindowAttributesChanged(attrs)这句代码,首先我们肯定知道,Activity肯定了这个接口,那么,还有其他的了这个接口吗? 在Android Studio中我们可以点击这个接口定义左边的向上箭头查看接口的类,我们发dialog了这个接口,那么回到第一个需求,解决方法就简单多了,只需要自定义一个Dialog,然后重写 二,基于Dialog监听软键盘的弹起和收下:其看完第一个需求,我们可能已经猜想到,软键盘也是基于当前窗口的,它的弹起和收下肯定会引起当前窗口布局的属性发生变化,所以解决思路就有了:监听当前布局的变化。

    1.1K30

    为什么不能使用 Application Context 显示 Dialog

    结合之前 Application 创建 Dialog 的报错信息,我们可以大胆猜测 Application Context 创建 Dialog 的过程中,并没有例化类似的 token。 虽然通过 Dialog Theme 的 Activity 仍然可以这一需求,但是 Google 也在加强 对后台启动 Activity 的限制。写到这里,问题似乎已经得到了解答。 一个 ActivtyRecord 代表一个 Activity 例, 它包含了 Activity 的所有信息。 我们从 AMS 启动 Activity 一路追到这里,其已经走到了 WMS 的逻辑。AMS 和 WMS 都是运行在 system_server 进程的,并不存在 binder 调用。 AMS 在启动 Activity 的时候,会构建表示 Activity 信息的 ActivityRecord 对象,其构造函数中会例化 Token 对象AMS 在接着上一步之后,会利用创建的 Token

    49220

    为什么不能使用 Application Context 显示 Dialog

    结合之前 Application 创建 Dialog 的报错信息,我们可以大胆猜测 Application Context 创建 Dialog 的过程中,并没有例化类似的 token。 虽然通过 Dialog Theme 的 Activity 仍然可以这一需求,但是 Google 也在加强 对后台启动 Activity 的限制。写到这里,问题似乎已经得到了解答。 一个 ActivtyRecord 代表一个 Activity 例, 它包含了 Activity 的所有信息。 我们从 AMS 启动 Activity 一路追到这里,其已经走到了 WMS 的逻辑。AMS 和 WMS 都是运行在 system_server 进程的,并不存在 binder 调用。 AMS 在启动 Activity 的时候,会构建表示 Activity 信息的 ActivityRecord 对象,其构造函数中会例化 Token 对象AMS 在接着上一步之后,会利用创建的 Token

    8040

    Android 接收推送消息跳转到指定页面的方法

    这时候要展示通知,点击通知栏打开App并跳转到目标页面,关闭目标页面后需要返回到应用首页,而不是直接推出App 思路App在前台时,弹出Dialog提醒用户有新消息,但是最新版的个推文档接收推送消息是继承 IntentService,无法获取弹出Dialog所需要的Context(注意不能用getApplicationContext()),所以采用Dialog样式的Activity App在后台时, 如果直接在PendingIntent中传目标Activity的Intent,则在退出目标Activity时会直接退出应用,感觉像是闪退了一样;如果是跳转到首页,然后在首页中检测是否是由点击通知进入应用的来进行跳转 综上方法都不是很理想,一个比较好的解决方案是给PendingIntent传递一个Intent数组,分别放置目标Activity和首页,这样效果比较好 App在前台时,弹出Dialog样式的Activity 设置Activity样式

    80140

    Android 全局Dialog的简单方法

    前言:这里所说的全局Dialog是指无论当前应用是处于哪一个页面上,都能够及时弹出Dialog来提示用户一些信息,用户体验不会很好,一般应用于优先级非常高的通知。 分析 :想要无论当前应用是处于哪一个页面上,都能够及时弹出Dialog功能其很简单,只要能获取到当前显示的Activity就行了,也就是栈顶的Activity过程 : 一般项目中我们都会通过一个类来管理我们的Activity,即AppManager** * Activity管理类 * @author Donkor *public class AppManager

    21620

    相关产品

    • 应用安全开发

      应用安全开发

      应用安全开发(Xcheck)专注于解决软件安全开发流程中研发阶段的代码安全问题,通过扫描源代码,实现开发阶段的代码安全漏洞生命周期闭环管理,帮助企业和组织实现源代码安全的自动化检测、漏洞周期管理、安全质量分析,实现源代码安全的可视化管理。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注云+社区

      领取腾讯云代金券