锁屏界面无法无法显示Toast

2024-09-06 09:08

本文主要是介绍锁屏界面无法无法显示Toast,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在锁屏界面开发几个快捷方式启动某些应用,例如:Calculator, Camera,Google voice和Call等,界面如下。且这种做法很普遍,很多厂商都有。


说明:

1>左边图片右下角为快速启动Calculator的快捷方式,在无需解锁的情况下,进入Calcaulator应用。

2>右边图片为从launcher中启动Calculator后,操作时弹出的Toast提示。

那么问题来了,当不解锁启动Calculator后,同操作无法显示Toast内容。


1.这里搜寻API,得到如下结果,本问题的核心也正在此。

/frameworks/base/core/java/android/view/WindowManager.java

        /** Window flag: special flag to let windows be shown when the screen* is locked. This will let application windows take precedence over* key guard or any other lock screens. Can be used with* {@link #FLAG_KEEP_SCREEN_ON} to turn screen on and display windows* directly before showing the key guard window.  Can be used with* {@link #FLAG_DISMISS_KEYGUARD} to automatically fully dismisss* non-secure keyguards.  This flag only applies to the top-most* full-screen window.*/public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;
        /** In a multiuser system if this flag is set and the owner is a system process then this* window will appear on all user screens. This overrides the default behavior of window* types that normally only appear on the owning user's screen. Refer to each window type* to determine its default behavior.** {@hide} */public static final int PRIVATE_FLAG_SHOW_FOR_ALL_USERS = 0x00000010;

用法如下,为此也写了个demo来验证此问题:


2.但是Toast的getWindowParams方法带@hide的隐藏接口,非公开API,于是尝试使用反射方法获取。


3.但是随之而来的又一个问题,WindowManager.LayoutParams的privateFlags也为非公开API。

        /*** Control flags that are private to the platform.* @hide*/public int privateFlags;

4.针对隐藏属性API,似乎无计可施。想到这是一个预置的应用,若是拥有平台签名,即可随意访问public的非公共API。

此方案可以参考另外一片文档《Android APK获取平台系统签名权限》,此处不作详述。

5.作为Calculator,原本可以是一个很普通的应用,若单为了这个Toast去提升应用之权限,似乎有不妥。于是又找了另一个法子,通过Toast.java源码的阅读,发现:

=>在调用Toast.makeText()方法时,会取new Toast对象;


而Toast的构造方法中又New了一个TN对象


6.结果发现,TN构造方法中就已经开始对此类“窗口”进行flags初始化。


说明:

上图时进行修改后的方法,为了避免对所有默认无参构造生成的Toast产生影响,即增加一个“构造方法”,使之更为方便地为类似Calculator这种应用场景的Toast服务。


7.

最终解决效果,如果加上para.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;将还能在Lockscreen中显示,如果用户快速返回退至Lock。



这篇关于锁屏界面无法无法显示Toast的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141596

相关文章

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

使用@Slf4j注解,log.info()无法使用问题

《使用@Slf4j注解,log.info()无法使用问题》在使用Lombok的@Slf4j注解打印日志时遇到问题,通过降低Lombok版本(从1.18.x降至1.16.10)解决了问题... 目录@Slf4androidj注解,log.info()无法使用问题最后解决总结@Slf4j注解,log.info(

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问