返回顶部
首页 > 资讯 > 移动开发 >Android如何实现锁屏状态下弹窗
  • 897
分享到

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

弹窗锁屏Android 2022-06-06 07:06:33 897人浏览 八月长安
摘要

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

前言

想在屏上面实现弹窗,第一个想法就是利用

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实现原生锁屏页面音乐控制


--结束END--

本文标题: Android如何实现锁屏状态下弹窗

本文链接: https://lsjlt.com/news/24297.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android如何实现锁屏状态下弹窗
    前言 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager 设置 Window 的 Flag,通过设置 Flag 的显示优先级来让窗口显示在锁屏的上面。 接下来...
    99+
    2022-06-06
    弹窗 锁屏 Android
  • Android程序开发仿新版QQ锁屏下弹窗功能
    新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能。经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意。 下面是实现过程。 1.使用A...
    99+
    2022-06-06
    弹窗 Android
  • Android Studio如何实现弹窗设置
    这篇文章主要介绍“Android Studio如何实现弹窗设置”,在日常操作中,相信很多人在Android Studio如何实现弹窗设置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”And...
    99+
    2023-06-30
  • 纯js如何实现右下角弹窗
    这篇文章将为大家详细讲解有关纯js如何实现右下角弹窗,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。这个弹窗是如下图的效果:打开网页的时候,这个弹窗会淡入,之后点击右上角的...
    99+
    2024-04-02
  • Android开发如何实现应用层面屏蔽状态栏
    这篇文章主要为大家展示了“Android开发如何实现应用层面屏蔽状态栏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android开发如何实现应用层面屏蔽状态栏”这篇文章吧。具体如下:一、由于S...
    99+
    2023-05-30
    android
  • vue如何实现自定义模态弹窗组件
    本篇内容主要讲解“vue如何实现自定义模态弹窗组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue如何实现自定义模态弹窗组件”吧! 一、创建弹窗组件 qu...
    99+
    2024-04-02
  • Android隐私协议提示弹窗如何实现
    这篇“Android隐私协议提示弹窗如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android隐私协议提示弹窗如何...
    99+
    2023-07-05
  • Vue如何实现弹窗Modal
    这篇文章给大家分享的是有关Vue如何实现弹窗Modal的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Vue作为最近最炙手可热的前端框架,其简单的入门方式和功能强大的API是其优点...
    99+
    2024-04-02
  • Android Studio如何实现透明状态栏
    这篇文章主要介绍Android Studio如何实现透明状态栏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,...
    99+
    2023-06-14
  • Android 如何实现弹窗顺序&优先级控制
    一般在项目首页中,往往会有多个对话框需要弹出,比如活动弹窗、更新弹窗、评分弹窗等等,而且这些弹窗是有优先级顺序的。这些弹窗一般是通过接口请求后返回结果再显示的,如果只有几个弹窗还好处...
    99+
    2024-04-02
  • Qt5如何实现主窗口状态栏显示时间
    这篇文章给大家分享的是有关Qt5如何实现主窗口状态栏显示时间的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用Qt Creator创建默认的窗体程序后,主窗口QMainWindow有statusBar状态栏,在此...
    99+
    2023-06-14
  • jquery如何实现弹窗功能
    这篇文章主要介绍jquery如何实现弹窗功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果图:代码如下:<!DOCTYPE HTML> <html&g...
    99+
    2024-04-02
  • jQuery如何实现弹出窗口
    这篇文章主要介绍jQuery如何实现弹出窗口,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!今天讲了Jquery的弹出窗口的组成和用法:先把引用文件的代码写好:// 每个弹窗...
    99+
    2024-04-02
  • javascript如何实现弹出窗口
    小编给大家分享一下javascript如何实现弹出窗口,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!方法:1、使用alert()实现警告框窗口,语法“alert(...
    99+
    2023-06-15
  • 如何使用JavaScript实现弹窗
    这篇文章主要介绍“如何使用JavaScript实现弹窗”,在日常操作中,相信很多人在如何使用JavaScript实现弹窗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用JavaScript实现弹窗”的疑...
    99+
    2023-07-06
  • 如何动态创建Angular组件实现popup弹窗功能
    这篇文章主要为大家展示了“如何动态创建Angular组件实现popup弹窗功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何动态创建Angular组件实现p...
    99+
    2024-04-02
  • 小程序开发中如何实现​显示模态弹窗
    这篇“小程序开发中如何实现显示模态弹窗”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“小程序开发中如何实现显示模态弹窗”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下...
    99+
    2023-06-26
  • Android onbackpressed如何实现返回键的拦截和弹窗
    这篇“Android onbackpressed如何实现返回键的拦截和弹窗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2023-07-04
  • “弹窗”是如何开发的?用状态驱动还是命令式?
    改成命令式的调用,使用者就无需去引入组件,挂载组件,声明回调,打断逻辑流,可以只关注于自己的数据。我的观点状态驱动多个弹窗类组件时,代码过于冗余。对于大型团队来说,一线业务开发人员,水平层次不去,代码风格各异,分散的状态驱动,每个人变量命名...
    99+
    2023-05-14
    React.js Vue.js JavaScript
  • Linux中如何实现进程D状态死锁检测
    小编给大家分享一下Linux中如何实现进程D状态死锁检测,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux的进程存在多种状态,如TASK_RUNNING的运...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作