android可以有一个悬浮窗口在进入屏保状态显示,点击进入应用,Android如何实现锁屏状态下弹窗...

前言

想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager设置 Window的 Flag,通过设置 Flag的显示优先级来让窗口显示在锁屏的上面。

接下来就是试验可能相关的 Window Type属性,验证该方案是否可行。

在尝试各个 Window Type 属性之前需要明确各个 Type 所需要的权限,下面是 com.android.internal.policy.impl.PhoneWindowManager.checkAddPermission 的源码:

public int checkAddPermission(WindowManager.LayoutParams attrs) {

int type = attrs.type;

if (type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW

|| type > WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) {

return WindowManagerImpl.ADD_OKAY;

}

String permission = null;

switch (type) {

case TYPE_TOAST:

// XXX right now the app process has complete control over

// this... should introduce a token to let the system

// monitor/control what they are doing.

break;

case TYPE_INPUT_METHOD:

case TYPE_WALLPAPER:

// The window manager will check these.

break;

case TYPE_PHONE:

case TYPE_PRIORITY_PHONE:

case TYPE_SYSTEM_ALERT:

case TYPE_SYSTEM_ERROR:

case TYPE_SYSTEM_OVERLAY:

permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW;

break;

default:

permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;

}

if (permission != null) {

if (mContext.checkCallingOrSelfPermission(permission)

!= PackageManager.PERMISSION_GRANTED) {

return WindowManagerImpl.ADD_PERMISSION_DENIED;

}

}

return WindowManagerImpl.ADD_OKAY;

}

明显不适合的 Type:TYPE_TOAST, TYPE_INPUT_METHOD, TYPE_WALLPAPER; 可能适合的 Type:TYPE_PHONE, TYPE_PRIORITY_PHONE, TYPE_SYSTEM_ALERT, TYPE_SYSTEM_ERROR, TYPE_SYSTEM_OVERLAY; 其它类型的 Type:

需要系统签名权限:

android.Manifest.permission.INTERNAL_SYSTEM_WINDOW

而申请该权限需要系统签名,所以我们是无法获取权限的。

TYPE_PHONE

/**

* Window type: phone. These are non-application windows providing

* user interaction with the phone (in particular incoming calls).

* These windows are normally placed above all applications, but behind

* the status bar.

* In multiuser systems shows on all users' windows.

*/

public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2;

TYPE_PHONE 类型的窗口可以显示在其它 APP 的上面,但不能显示在锁屏的上面,所以 PASS。

TYPE_PRIORITY_PHONE

/**

* Window type: priority phone UI, which needs to be displayed even if

* the keyguard is active. These windows must not take input

* focus, or they will interfere with the keyguard.

* In multiuser systems shows on all users' windows.

*/

public static final int TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW+7;

TYPE_PRIORITY_PHONE 类型的窗口可以显示在其它 APP 的上面,但不能显示在锁屏的上面,所以 PASS。而且实际的行为和注释并不相符,该类型的窗口是可以获取交互事件的,具体原因待查。

TYPE_SYSTEM_ALERT

/**

* Window type: system window, such as low power alert. These windows

* are always on top of application windows.

* In multiuser systems shows only on the owning user's window.

*/

public static final int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW+3;

TYPE_SYSTEM_ALERT类型的窗口可以显示在其它 APP 的上面,但不能显示在锁屏的上面,所以 PASS。

TYPE_SYSTEM_OVERLAY

/**

* Window type: system overlay windows, which need to be displayed

* on top of everything else. These windows must not take input

* focus, or they will interfere with the keyguard.

* In multiuser systems shows only on the owning user's window.

*/

public static final int TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+6;

TYPE_SYSTEM_OVERLAY 类型的窗口可以显示在所有其它窗口的上面,包括锁屏,而且不会影响它下面窗口的交互事件响应,但是该属性窗口不能获得焦点,无法进行交互(如果该窗口可以获取焦点,那么就可以用来抓取用户的锁屏密码,出于安全考虑,系统是不会允许的),所以只能用来简单的展示内容,如果需要交互的锁屏弹窗,那么该属性 PASS。

TYPE_SYSTEM_ERROR

/**

* Window type: internal system error windows, appear on top of

* everything they can.

* In multiuser systems shows only on the owning user's window.

*/

public static final int TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW+10;

在原生 ROM 5.1 下试验是可以显示出来的,但根据注释来看(appear on top of everything they can)不是在所有情况下都可以显示在锁屏上面的,而且像 MIUI 和 Flyme 等 ROM 默认是屏蔽浮窗权限的,考虑到这点,利用 WindowManager添加浮窗的方式实现锁屏弹窗的方案基本 PASS。

使用 Activity 的方式实现

首先需要对 Activity 进行如下设置

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

final Window win = getWindow();

win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD

| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

}

其中最主要也是必须要设置的就是:FLAG_SHOW_WHEN_LOCKED,顾名思义就是锁屏下显示该 Activity。而其它几个 Flag包括:解锁、保持屏幕常亮、点亮屏幕可以根据具体的需求选择设置。

在 AndroidManifest.xml 中声明 Activity

同样该 Activity也需要在 AndroidManifest.xml中声明,声明时需注意添加 android:excludeFromRecents="true" 属性,是为了将该 Activity从最近任务列表中去除,否则用户会觉得很奇怪。还有因为这个 Activity会整个盖在锁屏上面,而且就算设置成背景透明,锁屏界面也不会显示在下面(系统主要是出于安全考虑),所以需要考虑下该 Activity的背景,这里为了显示不要太突兀将主题设为壁纸。

android:launchMode="singleInstance"

android:excludeFromRecents="true"

android:theme="@android:style/Theme.Wallpaper.NoTitleBar"/>

启动 Activity

由于该 Activity是为了在锁屏的情况下显示的,所以启动 Activity时不要忘了判断手机是否处于锁屏状态,可以通过下面这种方式判断锁屏状态:

KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);

if (km.inKeyguardRestrictedInputMode()) {

// 处于锁屏状态

}

总结

以上就是在Android中实现锁屏状态下弹窗效果的全部内容,希望本文的内容对大家开发Android的时候能有所帮助,如果有疑问欢迎大家留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 调用 *.sql 文件

源&#xff1a;http://zhidao.baidu.com/question/5367984.html?si2using System; using System.Xml; using System.Data; using System.IO; using System.Collections; using System.Data.SqlClient; namespace ExecuteSqlFile { /// <summary> /// DBAccess 的摘要说明…

next按钮源码android,Android Edittext 软键盘输入法回车键改成下一步Next

软件盘中回车键默认功能是换行&#xff0c;但是有时候我们在Edittext中输完内容后点回车想要把焦点切到下一个Edittext继续输入&#xff0c;比如常见的登录页面&#xff0c;在输完用户名后&#xff0c;点回车调到输入密码输入框继续输入。示例代码代码很简单&#xff0c;如下所…

获取周的日期范围

/*** 获取周的日期范围* param string $week* param string $year* return array*/ public static function getWeekDate($week ,$year ) {/*** 2007年 第一周 是 01-01 到 01 - 07 因为第一天就是星期一 6* 2008年 第一周 是 01-01 到 01 - 06 因为第一天就是星期二 5 (闰年…

SQL SERVER 2005 T_SQL新的特性以及解决并发

一.修改语句的增强UPDATE test SET tname.WRITE(one hundred and two, 9, 3) WHERE tid 102在2005中增强了update方法&#xff0c;这是修改test表的列tname WRITE方法是把tname这个列中从字符串9开始 把3个长的字符串改为one hundred and two二、异常的捕获可以捕获过去会导致…

f5+big+client+android,F5负载均衡 MIBs bigip oid

F5 MIBs分组bigip-ltmpool-statoid".1.3.6.1.4.1.3375.2.2.5.2.3.1.1" name"ltmPoolStatName" smi-type"string"oid".1.3.6.1.4.1.3375.2.2.5.2.3.1.2" name"lPSServerPktsIn" smi-type"Counter"oid".1.3.6.…

Firefox: Connection Interrupted | The connection to the server was reset while the page was loading

http://blog.tangcs.com/2008/11/28/firefox-connection-interrupted/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/11/28/1343580.html

用dw(dreamweaver)开发asp.net,连接数据库时出现“http错误500,服务器内部错误”的解决方法...

前几天在用dreamweaver开发asp.net时&#xff0c;需要用到datagrid&#xff0c;但是在用dw的“应用程序/数据库”面板进行数据库连接时&#xff0c;老是弹出对话框&#xff1a;“http错误500&#xff0c;服务器内部错误”&#xff0c;无法连接数据库&#xff0c;搞了几天都没有…

android跑分和ios,手机:苹果VS安卓 跑分不代表手机流畅度

原标题&#xff1a;手机&#xff1a;苹果VS安卓 跑分不代表手机流畅度在当前的国内手机市场中&#xff0c;有两个阵营&#xff1a;安卓和苹果。 安卓系统仍然是使用最多的系统。从最初的128M内存到当前的十多GB内存&#xff0c;安卓手机已得到迅速发展和更新。但总体而言&#…

【转载】给程序员的圣诞大礼★★春夏

计算机寓言之春真爱与新生 1 两名学生 曾经有一名学生&#xff0c;他在课余时间里穿上古时侯的盔甲&#xff0c;随后他如今那些和他有类似想法的人在一起&#xff0c;模仿古代社会里的贵州和太太们。 另一名学生是计算机科学专业的&#xff0c;他问一名学生为什么要穿着奇装异服…

html5 打开网页自动全屏,HTML5实现浏览器播放全屏模式!

先写点css样式&#xff1a;*{margin:0;padding:0}.btn1{position:absolute;right:0;bottom:0;z-index:23;}.div1{position:relative;z-index:1;width:423px;height:230px;}这是全屏的封装函数&#xff1a;function aaa(element){if(element.requestFullscreen){element.reque…

Proxy(Chapter 22 of Pro Objective-C Design Patterns for iOS)

You’d naturally think about using the pattern when? You need a remote proxy that provides a local representative for an object in a different address space or in the network.? You need a virtual proxy to create heavy-weighted objects on demand. We will …

余宏德:Sun所有的核心技术都是开放的

3月30日上午&#xff0c;“Sun 2007年媒体论坛”在香港举办。时值Sun公司成立25周年&#xff0c;因此本次活动备受大家关注。Sun公司大中华区管理层和技术专家与40家左右的媒体记者进行了面对面的讨论。本次活动的主题是“创新共享成长&#xff0d;为社会进步而创新”&#xff…

html打开自动点击,如何把一段JS点击触发改为页面打开后就自动触发?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1、最简单的调用方式直接写到html的body标签里面&#xff0c;如&#xff1a;2、在JS语句调用function func(){……}window.οnlοadfunc;3、同时 调用多个函数直接写到html的body标签里面,如&#xff1a;4、js调用多个函数,以下这种…

图示/白话 execve执行流程

转载于:https://www.cnblogs.com/image-eye/archive/2011/07/13/2105411.html

转pbr随笔

光的基本传递模型]1 在一个要渲染的场景中&#xff0c;我们认为光能由预先指定的光源发出&#xff0c;然后我们以光线来描述光能的传递过程&#xff0c;当整个场景中的光能信息被我们计算出来后&#xff0c;我们收集这些信息转化为顶点的亮度。2 光线经过物体表面可以产生反射和…

易企秀手机html5场景源码,【VIP源码】六月1日最新完美版易企秀微信场景源码

[v_notice]下面演示图为哥亲测截图&#xff0c;仅供参考&#xff0c;在这里下载的源码100%和演示截图一致[/v_notice]修补的首页&#xff1a;前台用户后台界面&#xff1a;场景制作界面&#xff1a;转场特效页面&#xff1a;特效增加&#xff1a;设计模板&#xff1a;制作预览页…

老程序员的10个忠告(转)

[1]好好规划自己的路&#xff0c;不要跟着感觉走&#xff01;根据个人的理想决策安排&#xff0c;绝大部分人并不指望成为什么院士或教授&#xff0c;而是希望活得滋润一些&#xff0c;爽一些。那么&#xff0c;就需要慎重安排自己的轨迹。从哪个行业入手&#xff0c;逐渐对该行…

Effective C# 原则48:了解更多的工具和资源(译)

Effective C# 原则48&#xff1a;了解更多的工具和资源 Item 48: Learn About Tools and Resources 对于C#以及.Net来说这是激动人心的时候。这些工具目前还是比较新的&#xff0c;整个社区都在学习如何使用这些工具。一些资源可以帮助你提高你的知识&#xff0c;以及为.Net和…

计算机2013知识,【2013年计算机基础知识习题与答案(三)】- 环球网校

46.与十进制数128等值的二进制数是10000000.47.与十进制数217等值的二进制数是11011001.48.八进制数的基数为8&#xff0c;能用到的数字符号个数为8.49.十进制数38转换成八进制数是46.50.十进制数72转换成八进制数是110.51.与十进制数283等值的十六进制数是11B.52.与二进制数11…

上周回顾:艾妮闹春 Sun/HP高层人士震荡

进入4月&#xff0c;春暖花开。然而随着Vista首个漏洞“ANI”的到来&#xff0c;上周显然让许多人又紧张了一回。同样紧张的还有IT媒体的记者&#xff1a;周一一上班就传出Sun公司大中华区总裁余宏德和其他高管离职的消息&#xff0c;周五临下班HP中国总裁孙振耀又宣布“退休”…