在要弹窗的Activity需要进行以下设置,才可以在锁屏状态下弹窗

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. final Window win = getWindow();
  4. win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //锁屏状态下显示
  5. // | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD //解锁
  6. | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON //保持屏幕长亮
  7. | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); //打开屏幕
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);

AndroidManifest.xml文件当中,对该activity的声明需要加上以下属性:

  1. <activity android:name=".Activity"
  2. android:launchMode="singleInstance"
  3. android:excludeFromRecents="true"
  4. android:taskAffinity=""
  5. android:theme="@android:style/Theme.Wallpaper.NoTitleBar"/>

在MainActivity:

  1. public class MainActivity extends Activity {
  2. IntentFilter intentFilter;
  3. LocalBroadcastManager localBroadcastManager;
  4. LocalBroadcastReceiver localBroadcastReceiver;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. Thread thread =new Thread(
  11. new Runnable() {
  12. @Override
  13. public void run() {
  14. while (true) {
  15. try {
  16. Thread.sleep(5000);
  17. Log.i("send", "send ok");
  18. Intent intent = new Intent("com.example.stuart.LOCAL_BROADCAST");
  19. localBroadcastManager.sendBroadcast(intent);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23.  
  24. }
  25. }
  26. }
  27.  
  28. );
  29. thread.start();//模拟5秒自动发送广播
  30.  
  31. localBroadcastManager =LocalBroadcastManager.getInstance(this);
  32. intentFilter =new IntentFilter();
  33. intentFilter.addAction("com.example.stuart.LOCAL_BROADCAST");
  34. localBroadcastReceiver =new LocalBroadcastReceiver();
  35. localBroadcastManager.registerReceiver(localBroadcastReceiver,intentFilter);
  36.  
  37. }
  38.  
  39. public void check_lock(){
  40.  
  41. // KeyguardManager km = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);
  42. // if (km.isKeyguardLocked()) {
  43. // Intent intent =new Intent("com.example.stuart.LOCAL_BROADCAST");
  44. // intent .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  45. // localBroadcastManager.sendBroadcast(intent);
  46. //
  47. // }
  48. // Thread thread =new Thread(
  49. // new Runnable() {
  50. // @Override
  51. // public void run() {
  52. // try {
  53. // Thread.sleep(5000);
  54. // Intent intent =new Intent("com.example.stuart.LOCAL_BROADCAST");
  55. // localBroadcastManager.sendBroadcast(intent);
  56. // } catch (InterruptedException e) {
  57. // e.printStackTrace();
  58. // }
  59. //
  60. // }
  61. // }
  62. //
  63. //
  64. //
  65. // );
  66. // thread.start();
  67.  
  68. }
  69. class LocalBroadcastReceiver extends BroadcastReceiver{
  70.  
  71. @Override
  72. public void onReceive(Context context, Intent intent) {
  73. Log.d("LOG_TAG", intent.getAction());
  74. KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
  75. if (km.isKeyguardLocked()) {
  76. Intent alarmIntent = new Intent(context, AlarmActivity.class);
  77. alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  78. context.startActivity(alarmIntent);
  79. }
  80. }
  81. }

我们设置的是锁屏下才弹窗的,非锁屏下就不适合弹出这个窗口了(你可以试一下,效果会很怪)。一般是注册一个广播接收器,在接收到指定广播之后判断是否需要弹窗,所以在BroadcastReceiver的接收代码中需要先判断是否为锁屏状态下:

这里用到的是KeyguardManager类,用来管理锁屏的,4.1之后该类的API新增了一个isKeyguardLocked()的方法判断是否锁屏,但在4.1之前,我们只能用inKeyguardRestrictedInputMode()方法,如果为true,即为锁屏状态。需要注意的是,在广播中启动Activity的context可能不是Activity对象,所以需要添加NEW_TASK的标志,否则启动时可能会报错。

再次亮起屏幕

如果该Activity并未退出,但是被手动按了锁屏键,当前面的广播接收器再次去启动它的时候,屏幕并不会被唤起,所以我们需要在activity当中添加唤醒屏幕的代码,这里用的是电源锁。可以添加在onNewIntent(Intent intent),因为它会被调用。也可以添加在其他合适的生命周期方法

  1. PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
  2. if (!pm.isScreenOn()) {
  3. PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |
  4. PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
  5. wl.acquire();
  6. wl.release();
  7. }

权限

  1. <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
  2. <uses-permission android:name="android.permission.WAKE_LOCK"/>

参考:http://blog.csdn.net/maosidiaoxian/article/details/40587935

http://bbs.csdn.net/topics/390425777

Android LockScreen (锁屏弹窗)的更多相关文章

  1. Android 开发之锁屏弹窗

    尝试利用 WindowManager 添加浮窗的方式实现 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager 设置 Window 的 Flag,通过设置 Flag 的显示优先级来让窗 ...

  2. Android逆向之旅---Android中锁屏密码算法解析以及破解方案

    一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机 ...

  3. Android忘记锁屏密码如何进入手机?

    Android忘记锁屏密码如何进入手机?     1.关闭手机 2.进入recovery模式(即恢复模式,记住不是挖煤模式.进入恢复模式不同手机有不同方法,三星的话安主页键,关机键和音量+(或-键), ...

  4. Android一键锁屏源码

    APK下载 源程序下载 锁屏流程如下(参考于Android一键锁屏开发全过程[源码][附图]) 源码参考于一键锁屏 源码 一共有2个Java文件: package com.example.onekey ...

  5. 【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57875330c9da73584b025873 一.为什么需要自定义锁屏页 锁屏 ...

  6. 浅谈 Android 自定义锁屏页的发车姿势

    作者:blowUp,原文链接:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653577446&idx=2&sn= ...

  7. 浅谈Android自定义锁屏页的发车姿势

    一.为什么需要自定义锁屏页 锁屏作为一种黑白屏时代就存在的手机功能,至今仍发挥着巨大作用,特别是触屏时代的到来,锁屏的功用被发挥到了极致.多少人曾经在无聊的时候每隔几分钟划开锁屏再关上,孜孜不倦,其酸 ...

  8. android开发 锁屏 真正的锁屏,是go锁屏那种。

    想做个锁屏界面很久了,最近一周,历经千辛万苦,越过种种挫折,终于完美实现了这一要求,在此将锁屏思路分享出来. 注意:这不是什么一键锁屏,是类似“go锁屏”那样的锁屏界面. 准备:本程序共需要 两个ac ...

  9. Android一键锁屏APP

    题记: 这个app完全是拾人牙慧,作为练手用的,其实没有什么原创的东西.当然,博客还是我自己写的,记录下来,对自己也算是一种成长吧. 转载请注明原文地址: http://www.cnblogs.com ...

随机推荐

  1. 第三章,设置button边框(Android)

    这样的方法是通过层叠几个图片实现边框效果. 在res目录下的drawable目录下(没有就新建)建一个xml文件选layer-list. <?xml version="1.0" ...

  2. Android 珍藏(一)

    1,调web浏览器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = new Intent(Intent.ACTI ...

  3. nodeJs-autoMerge

    /** * Created by Administrator on 2016/1/16. */ var fs = require('fs'); var filedir='automay'; conso ...

  4. Java之Jackson框架

    在Jackson框架中,提供了三种方式用来处理JSON数据: 流式API 在该方式下,使用JsonParser读取JSON数据,使用JsonGenerator写JSON数据.这种方式性能最佳(最低开销 ...

  5. cocos2d-x 3.0 场景切换特效汇总

    cocos2d-x 3.0中场景切换特效比較多,并且游戏开发中也常常须要用到这些特效.来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替 ...

  6. Android---06---2中动画效果

    1,先看FrameAnimation,此动画是用来实现动态动画就是把一帧帧图片迭代起来 放在drowable中的xml: <?xml version="1.0" encodi ...

  7. tcpdump command

    工作中一直在用tcpdump,感觉非常方便,今天心血来潮百度了一下tcpdump的用法,才发现原来还有这么多强大的功能自己都不知道,那叫一个汗啊. 以此文作为备份,记录一些新知道的用法,各位网友谁有新 ...

  8. EF、Dapper、NHibernate等ORM框架的比较及优缺点

    什么是ORM? ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操 ...

  9. HDU 4417 划分树+二分

    题意:有n个数.m个询问(l,r,k),问在区间[l,r] 有多少个数小于等于k. 划分树--查找区间第k大的数.... 利用划分树的性质.二分查找在区间[l,r]小于等于k的个数. 假设在区间第 i ...

  10. 千万级的大表!MySQL这样优化更好

    对于一个千万级的大表,现在可能更多的是亿级数据量,很多人第一反应是各种切分,可结果总是事半功倍,或许正是我们优化顺序的不正确.下面我们来谈谈怎样的优化顺序可以让效果更好. MySQL数据库一般都是按照 ...