实现锁屏的方式有多种(锁屏应用、悬浮窗、普通Activity伪造锁屏等等)。但国内比较主流并且被广泛应用的Activity伪造锁屏方式。

实例演示图片如下:

系列文章链接如下:

[Android] Android 锁屏实现与总结 (一)

[Android] Android 锁屏实现与总结 (二)

[Android] Android 锁屏实现与总结 (三)

代码文件地址:

https://github.com/wukong1688/Android-BaseLockScreen

1、广播注册

2、Activity设置

3、按键的屏蔽

4、滑屏解锁

Activity实现自定义锁屏页的思路很简单,即在听书模式开启时,启动一个service,在service中监听系统SCREEN_OFF的广播。当屏幕熄灭时service监听到广播,开启一个锁屏页Activity在屏幕最上层显示,该Activity创建的同时会去掉系统的锁屏(如果有密码是禁不掉的)。示意图如下:

二、重要实现

1、广播注册

<serviceandroid:name=".service.LockScreenService"android:enabled="true"android:exported="true" />

注意:SCREEN_OFF广播监听必须是 动态注册 的,如果在AndroidManifest.xml中静态注册将无法接收到SCREEN_OFF广播。

LockScreenService.java

详细代码如下:

package com.jack.applockscreen.service;import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.BitmapFactory;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.widget.Toast;import com.jack.applockscreen.R;
import com.jack.applockscreen.activity.DetailActivity;
import com.jack.applockscreen.activity.LockScreenActivity;
import com.jack.applockscreen.receiver.LockScreenReceiver;public class LockScreenService extends Service {private LockScreenReceiver mReceiver;private IntentFilter mIntentFilter = new IntentFilter();private boolean isNotiShow = false;@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//动态注册
        mIntentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);mIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);mIntentFilter.addAction(Intent.ACTION_SCREEN_ON);mIntentFilter.addAction(Intent.ACTION_TIME_TICK);mIntentFilter.setPriority(Integer.MAX_VALUE);if (null == mReceiver) {mReceiver = new LockScreenReceiver();mIntentFilter.setPriority(Integer.MAX_VALUE);registerReceiver(mReceiver, mIntentFilter);buildNotification();Toast.makeText(getApplicationContext(), "开启成功", Toast.LENGTH_LONG).show();}return START_STICKY;}/*** 通知栏显示*/private void buildNotification() {if (!isNotiShow){ //避免多次显示NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);Intent intent = new Intent(this, DetailActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);Notification notification = new NotificationCompat.Builder(this, "default").setTicker("APP正在运行").setAutoCancel(false).setContentTitle("APP正在运行").setContentText("运行中").setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).setSmallIcon(R.mipmap.ic_launcher).setContentIntent(pendingIntent).build();manager.notify(1, notification);startForeground(0x11, notification);isNotiShow = true;}}@Overridepublic void onDestroy() {if (mReceiver != null) {unregisterReceiver(mReceiver);mReceiver = null;}super.onDestroy();}
}

广播接收 LockScreenReceiver.java

package com.jack.applockscreen.receiver;import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telecom.TelecomManager;
import android.telephony.TelephonyManager;import com.jack.applockscreen.activity.LockScreenActivity;
import com.jack.applockscreen.util.Parser;public class LockScreenReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (Intent.ACTION_SCREEN_OFF.equals(action)) {if (Parser.sPhoneCallState == TelephonyManager.CALL_STATE_IDLE) { // 手机状态为未来电的空闲状态// 判断锁屏界面是否已存在,如果已存在就先finish,防止多个锁屏出现if (!Parser.KEY_GUARD_INSTANCES.isEmpty()) {for (Activity activity : Parser.KEY_GUARD_INSTANCES) {activity.finish();}}Intent lockScreen = new Intent(context, LockScreenActivity.class);lockScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);context.startActivity(lockScreen);}} else {Parser.killBackgroundProcess(context);}}
}

注意:

1) 标志位FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,是为了避免在最近使用程序列表出现Service所启动的Activity。

2) 启动Activity时Intent的Flag,如果不添加FLAG_ACTIVITY_NEW_TASK的标志位,会出现“Calling startActivity() from outside of an Activity”的运行时异常,因为我们是从Service启动的Activity。Activity要存在于activity的栈中,而Service在启动activity时必然不存在一个activity的栈,所以要新起一个栈,并装入启动的activity。使用该标志位时,也需要在AndroidManifest中声明taskAffinity,即新task的名称,否则锁屏Activity实质上还是在建立在原来App的task栈中。
下接:

[Android] Android 锁屏实现与总结 (二)

本博客地址: wukong1688

本文原文地址:https://www.cnblogs.com/wukong1688/p/10716875.html

转载请著名出处!谢谢~~

转载于:https://www.cnblogs.com/wukong1688/p/10716875.html

[Android] Android 锁屏实现与总结 (一)相关推荐

  1. android锁屏密码文件夹,深入理解Android M 锁屏密码存储方式

    Android M 之前锁屏密码的存储 在 Android M 之前,锁屏密码的存储格式很简单,其使用了 64 位随机数作为 salt 值,此 salt 值被存储在 sqlite 数据库 /data/ ...

  2. android锁屏软件开发,Android一键锁屏开发全过程

    一.项目简介: 项目:<Android 一键锁屏> 开发周期:4天 代码量:100行 二.项目流程: 三.项目代码 1.主程序代码: 1.private DevicePolicyManag ...

  3. 一键锁屏源代码c语言,Android一键锁屏开发全过程【源码】【附图】

    一.项目简介: 项目:<Android 一键锁屏> 开发周期:4天 代码量:100行 ------------------------ 二.项目流程: 三.项目代码 1.主程序代码: Ja ...

  4. Android一键锁屏代码

    锁屏小Demo 由于手机关机键最近不好用了,所以就研究研究一键锁屏的小玩意. 首先创建一个工程 布局很简单,就一个button <?xml version="1.0" enc ...

  5. Android一键锁屏源码

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

  6. java修改手机锁屏密码,深入理解Android M 锁屏密码存储方式

    Android M 之前锁屏密码的存储 在 Android M 之前,锁屏密码的存储格式很简单,其使用了 64 位随机数作为 salt 值,此 salt 值被存储在 SQLite 数据库 /data/ ...

  7. android 输入锁屏密码错误,安卓系统手机锁屏密码输错被停用了如何解决

    手机对于大家来说并不陌生,它已经成为了人们的生活和工作中必不可少的一部分,然而处于安全考虑,每个使用手机的用户都会将自己的手机设置锁屏密码,无论是手势锁.密码锁.人脸识别等等,当然只有知道密码的人才能 ...

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

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

  9. android 锁屏解决方案,Android 实现锁屏的较完美方案

    实现锁屏的方法,其实上网一搜一大把,无非是告诉你在Screen Off的时候启动某个Activity,同时把Keyguard禁用掉,但是通常情况下,似乎很难解决HOME键能解锁的这么一个问题,今天我们 ...

  10. Android 原生锁屏页面音乐控制

    Android5.0 提出了全新的MediaSession概念用于播放器与控制器之间进行交互,它取代之前的RemoteControlClient,并提供了更为灵活的客户端受控端模型. 但是MediaS ...

最新文章

  1. RDKit | 基于RDKit通过SMARTS定义反应模式来生成反应产物
  2. org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 60
  3. 文件菜单服务器属性,服务器属性(“数据库设置”页) - SQL Server | Microsoft Docs...
  4. ElementUI中的el-table实现多选框不勾选的提示
  5. phpstrpos不存在_PHP主页显示方法不存在。这是什么问题,大神帮我看看
  6. 当Sklearn遇上Plotly,会擦出怎样的火花?
  7. mysql将备份的数据导入_成功将MySQL的大型数据导入导出和备份(转载)
  8. 十万个为什么儿童版_《虹猫蓝兔十万个为什么》上架爱奇艺奇巴布绘本馆
  9. 使用 store 来优化 React 组件
  10. Application Virtualization 4.5 部署之(二)
  11. 关于分布式系统架构模块通讯方式选择的问题
  12. 从Flutter路由报错引申BuildContext详解
  13. 我的小导师-天津大学张梅山老师要招NLP方向的研究生啦!
  14. python一维数组聚类
  15. 集中火力 专项击破|数据分析可视化广深线下培训火热来袭
  16. 手动删除Mac版迅雷无用的功能,让迅雷软件更清爽无广告纯粹下载
  17. arcgis利用切片服务导出离线地图包(tpk文件)
  18. App Store商店图片文案填写说明
  19. pow函数php,PHP pow( )用法及代码示例
  20. 基于Perclos&改进YOLOv7的疲劳驾驶DMS检测系统(源码&教程)

热门文章

  1. 调用接口时form-data形式如何传递数据
  2. 同时支持mp4/ogg/webm/flv格式的视频播放
  3. SpringBoot+Vue.js实现大文件分片上传、断点续传与极速秒传
  4. react周期函数介绍
  5. 【动态规划】LeetCode 1143最长公共子序列
  6. akamai:与看视频广告等待相比,用户更不能忍受缓冲等待
  7. Linux 开发中的常用命令 ( Cygwin 环境也同样适用)
  8. 【vjudge contest 418548】2021 BUAA Winter Training 3(Private),签到题ABCDG
  9. 【2020团体程序设计天梯赛】L1部分(PTA,L1-065到L1-072)题解代码
  10. 【NOIP2010】【Luogu1190】接水问题(给定顺序的模拟)