前言

想在锁屏上面实现弹窗,第一个想法就是利用 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的时候能有所帮助,如果有疑问欢迎大家留言讨论。

android 锁屏 浮动窗口,Android如何实现锁屏状态下弹窗相关推荐

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

    前言 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager设置 Window的 Flag,通过设置 Flag的显示优先级来让窗口显示在锁屏的上面. 接下来就是试验可能相关的 Windo ...

  2. android多个悬浮窗口,android 添加随意拖动的桌面悬浮窗口

    用过新版本android 360手机助手都人都对 360中只在桌面显示一个小小悬浮窗口羡慕不已吧? 其实实现这种功能,主要有两步: 1.判断当前显示的是为桌面.这个内容我在前面的帖子里面已经有过介绍, ...

  3. 浮动窗口代码(带关闭按钮+全屏漂浮)

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  4. android timer弹出窗口,android – 如何在服务类中的Timer内显示AlertDialog?

    我想在Service类的Timer中显示AlertDialog,我使用以下代码: timer.scheduleAtFixedRate( new TimerTask() { private Handle ...

  5. android中拖拽浮动按钮,Android自定义view实现拖拽选择按钮

    本文实例为大家分享了Android实现拖拽选择按钮的具体代码,供大家参考,具体内容如下 DragChooseDemo 效果图 Attributes属性(布局文件中的自定义属性) 半径.文字大小.按钮个 ...

  6. android tcp 最优窗口,Android 面试必备 - 计算机网络基本知识(TCP,UDP,Http,https)...

    简介 HTTP协议(超文本传输协议)和 UDP(用户数据包协议),TCP 协议(传输控制协议) TCP/IP是个协议组,可分为四个层次:网络接口层.网络层.传输层和应用层. 在网络层有IP协议.ICM ...

  7. android开发技巧——仿新版QQ锁屏下弹窗

    新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是V ...

  8. android布局管理器模仿qq登录效果,Android程序开发仿新版QQ锁屏下弹窗功能

    新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是V ...

  9. 仿新版QQ锁屏下弹窗

    首先,先感谢下: "貌似掉线"朋友,我在上这一个项目中也用到了这个功能,看了他写的博客后基本实现了我想要的.之所以说是"基本实现",是因为还差一点," ...

  10. 安卓开发--关于锁屏状态下如何实现消息推送

    安卓开发–关于锁屏状态下如何实现消息推送 1. 新建一个AlarmHandlerActivity并设置在锁屏状态下弹窗! onCreate方法中添加标志: /* * 分别是锁屏状态下显示,解锁,保持屏 ...

最新文章

  1. 数据库链接池终于搞对了,这次直接从100ms优化到3ms!
  2. 【crontab】误删crontab及其恢复
  3. wxPython笔记
  4. 纯代码实现wordpress文章隐藏内容评论可见
  5. 重温强化学习之无模型学习方法:TD(lambda)
  6. DHCP协议原理及其实现流程
  7. 创建新的SAP CRM product search scenario - 如何在SAP CRM里实现自定义的产品搜索场景
  8. U盘专杀工具,U盘防御软件,U盘病毒防火墙--UDiskSyS
  9. R语言程序员转型首选,年薪35W+,市场缺口巨大!
  10. 网页图片压缩优化,提高网站打开速度
  11. python中日期和时间格式化输出的方法
  12. 恶意软件分析(二)玩出花的批处理(中)
  13. 金华万豪、温州万豪、温州乐清万怡、哈尔滨城市中心万枫、九寨英迪格等酒店开业 | 全球旅报...
  14. Invalid component name: “_compiled“. Component names should conform to valid custom element name组件报错
  15. 数据可视化—复杂网络关系图的绘制
  16. 2022 云原生编程挑战赛圆满收官,见证冠军战队的诞生
  17. 使用unity的Microphone接口进行录音时遇到的相关问题
  18. 办公软件excel的实用技巧
  19. Multisim的2.8.x的实验报告
  20. Git工作流应该如何选择

热门文章

  1. 指数基金日涨跌幅python_Python数说指数定投策略
  2. 百度地图图层开发java_Android百度地图应用之图层展示
  3. Sorted Adjacent Differences
  4. 关于java基础知识的代码引用
  5. 2016届毕业设计(论文) 基本规范及档案袋封面填写要求
  6. 江苏凤凰职教计算机教案,2017年江苏省职业学校教学大赛方案
  7. Caffe中求解器(Solver)介绍
  8. SDUT—Python程序设计实验四(字符串)
  9. 云计算数据中心网络安全的实现原理
  10. Electron点击右上角关闭按钮隐藏任务栏图标(electron类似杀毒软件的任务栏图标)