我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android如何实现锁屏状态下弹窗

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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



public static final int TYPE_PHONE       = FIRST_SYSTEM_WINDOW+2;

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

TYPE_PRIORITY_PHONE



public static final int TYPE_PRIORITY_PHONE   = FIRST_SYSTEM_WINDOW+7;

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

TYPE_SYSTEM_ALERT



public static final int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW+3;

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

TYPE_SYSTEM_OVERLAY



public static final int TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+6;

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

TYPE_SYSTEM_ERROR



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 
的背景,这里为了显示不要太突兀将主题设为壁纸。


<activity android:name=".LockScreenActivity" 
     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系统永不锁屏永不休眠的方法Android屏幕锁屏弹窗的正确姿势DEMO详解Android编程实现一键锁屏的方法Android编程实现禁止系统锁屏与解锁亮屏的方法android禁止锁屏保持常亮(示例代码)Android系统永不锁屏永不休眠的方法Android 监听锁屏、解锁、开屏 功能代码Android编程实现的一键锁屏程序详解Android实现原生锁屏页面音乐控制


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android如何实现锁屏状态下弹窗

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android如何实现锁屏状态下弹窗

前言 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager 设置 Window 的 Flag,通过设置 Flag 的显示优先级来让窗口显示在锁屏的上面。 接下来就是试验可能相关的 Window Type 属性,验证该方案是否
2022-06-06

Android Studio如何实现弹窗设置

这篇文章主要介绍“Android Studio如何实现弹窗设置”,在日常操作中,相信很多人在Android Studio如何实现弹窗设置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android Studi
2023-06-30

Android开发如何实现应用层面屏蔽状态栏

这篇文章主要为大家展示了“Android开发如何实现应用层面屏蔽状态栏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android开发如何实现应用层面屏蔽状态栏”这篇文章吧。具体如下:一、由于S
2023-05-30

Android隐私协议提示弹窗如何实现

这篇“Android隐私协议提示弹窗如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android隐私协议提示弹窗如何
2023-07-05

Android Studio如何实现透明状态栏

这篇文章主要介绍Android Studio如何实现透明状态栏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,
2023-06-14

Qt5如何实现主窗口状态栏显示时间

这篇文章给大家分享的是有关Qt5如何实现主窗口状态栏显示时间的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用Qt Creator创建默认的窗体程序后,主窗口QMainWindow有statusBar状态栏,在此
2023-06-14

小程序开发中如何实现​显示模态弹窗

这篇“小程序开发中如何实现显示模态弹窗”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“小程序开发中如何实现显示模态弹窗”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下
2023-06-26

Android onbackpressed如何实现返回键的拦截和弹窗

这篇“Android onbackpressed如何实现返回键的拦截和弹窗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“An
2023-07-04

Linux中如何实现进程D状态死锁检测

小编给大家分享一下Linux中如何实现进程D状态死锁检测,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux的进程存在多种状态,如TASK_RUNNING的运
2023-06-16

Android如何实现状态栏白底黑字效果

这篇文章给大家分享的是有关Android如何实现状态栏白底黑字效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、描述在项目中有的时候Ui设计状态栏背景颜色是白色的,虽然还挺好看,不过可坑了我们做程序的,需要对
2023-05-30

如何实现在Linux下锁住键盘和鼠标而不锁屏

这期内容当中小编将会给大家带来有关如何实现在Linux下锁住键盘和鼠标而不锁屏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。假如在你正看着屏幕上的某些重要的事情时,你不想让你的小猫或者小狗在你的键盘上行走
2023-06-06

vue3.2+ts如何实现在方法中可调用的拟态框弹窗

这篇“vue3.2+ts如何实现在方法中可调用的拟态框弹窗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue3.2+ts如
2023-07-04

Android项目中如何实现判断屏幕是否亮屏与解锁

本篇文章给大家分享的是有关Android项目中如何实现判断屏幕是否亮屏与解锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1.屏幕是否亮屏:PowerManager powe
2023-05-31

Android项目中如何实现获取状态栏的高度

这篇文章将为大家详细讲解有关Android项目中如何实现获取状态栏的高度,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。方法一:private double getStatusBarHeigh
2023-05-31

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录