跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Android 锁屏服务实现与电话状态监听

综述由AI生成Android 锁屏服务通过注册屏幕开关广播和电话状态监听器实现。服务启动后禁用锁屏,监听通话状态变化(空闲、振铃、挂断)。当屏幕关闭且处于空闲状态时,延迟触发锁屏界面跳转,并维持 CPU 运行以确保任务执行。代码展示了 KeyguardManager 和 TelephonyManager 的具体用法。

DevStack发布于 2025/1/17更新于 2026/6/1325 浏览
Android 锁屏服务实现与电话状态监听

Android 锁屏服务实现

功能概述

该服务类主要处理屏幕开关广播及电话状态监听。启动后首先注册接受屏幕的关闭和开启的广播,在广播中处理开屏锁屏任务;获取电话管理服务,注册通话状态监听,监听手机响铃状态、挂起状态、空闲状态,以 Handler 方式执行不同的任务。

核心逻辑

  1. 屏幕监听:注册 ACTION_SCREEN_OFF 和 ACTION_SCREEN_ON 广播。
  2. 电话监听:使用 PhoneStateListener 监听通话状态变化。
  3. 锁屏控制:通过 KeyguardManager 禁用或启用锁屏。
  4. 任务调度:利用 Handler 处理延迟锁屏跳转及唤醒锁管理。
import android.app.KeyguardManager;
import android.app.Service;
import android.app.KeyguardManager.KeyguardLock;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.PowerManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class LockService extends Service {
    protected static final String TAG = "SAFLockService";
    KeyguardManager mKeyguardManager;
    private KeyguardLock mKeyguardLock = null;
     TelephonyManager tm;
     Context mContext;

    
       {
        .onCreate();
        mContext = .getApplicationContext();

        Log.v(TAG, );
            ();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_SCREEN_ON);
        registerReceiver(mScreenReceiver, filter);

        mKeyguardManager = (KeyguardManager) .getSystemService(Context.KEYGUARD_SERVICE);
        mKeyguardLock = mKeyguardManager.newKeyguardLock();
        mKeyguardLock.disableKeyguard();

        tm = (TelephonyManager) .getSystemService(Context.TELEPHONY_SERVICE);
            ();
        tm.listen(myPhoneCallListener, PhoneStateListener.LISTEN_CALL_STATE);

        SAFLockConstants.loadInitParam();
        .setForeground();
    }

    
     IBinder  {
         ;
    }

    
       {
        .onDestroy();
        mKeyguardLock.reenableKeyguard();
        mHandler.removeMessages(SAFLockConstants.EVENT_LOCK_SCREEN);
        unregisterReceiver(mScreenReceiver);
    }

    
         {
           {
             (state) {
                
                 TelephonyManager.CALL_STATE_IDLE:
                    Log.v(TAG, );
                    SAFLockConstants.PHONE_STATE = TelephonyManager.CALL_STATE_IDLE;
                     (SAFLockConstants.isLockecd) {
                        mHandler.removeMessages(SAFLockConstants.EVENT_LOCK_SCREEN);
                        mHandler.sendEmptyMessage(SAFLockConstants.EVENT_LOCK_SCREEN);
                    }
                    ;
                
                 TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.v(TAG, );
                    SAFLockConstants.PHONE_STATE = TelephonyManager.CALL_STATE_OFFHOOK;
                    ;
                
                 TelephonyManager.CALL_STATE_RINGING:
                    Log.v(TAG, );
                    SAFLockConstants.PHONE_STATE = TelephonyManager.CALL_STATE_RINGING;
                    ;
                :
                    Log.v(TAG, );
                    ;
            }
        }
    }

         () {
        
           {
             (msg.what) {
                 SAFLockConstants.EVENT_LOCK_SCREEN:
                    
                    SAFLockConstants.updateLockIntent(
                            , mContext);

                    
                       (PowerManager) mContext
                            .getSystemService(Context.POWER_SERVICE);
                    
                    
                    PowerManager.   pm.newWakeLock(
                            PowerManager.PARTIAL_WAKE_LOCK, );
                    mWakeLock.acquire();

                        (mContext,
                            SAFFullScreenActivity.class);
                    mLockScreenIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    mLockScreenIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                    mContext.startActivity(mLockScreenIntent);
                    ;
                :
                    ;
            }
        }
    };

         () {
        
           {
               intent.getAction();

             (Intent.ACTION_SCREEN_OFF.equalsIgnoreCase(action)) {
                
                 (SAFLockConstants.LOCK_ENABLE
                        && SAFLockConstants.PHONE_STATE == TelephonyManager.CALL_STATE_IDLE) {

                    
                     (!SAFLockConstants.isLockecd) {
                        mHandler.removeMessages(SAFLockConstants.EVENT_LOCK_SCREEN);
                        mHandler.sendEmptyMessageDelayed(
                                SAFLockConstants.EVENT_LOCK_SCREEN, );
                    }
                }
            }   (Intent.ACTION_SCREEN_ON.equalsIgnoreCase(action)) {
                
                mHandler.removeMessages(SAFLockConstants.EVENT_LOCK_SCREEN);
            }
        }
    };
}
private
private
@Override
public
void
onCreate
()
super
this
"=============onCreate:================"
IntentFilter
filter
=
new
IntentFilter
this
""
this
SAFLockPhoneCallListener
myPhoneCallListener
=
new
SAFLockPhoneCallListener
this
this
true
@Override
public
onBind
(Intent intent)
return
null
@Override
public
void
onDestroy
()
super
/** * set a listener to listen the phonestate,that we can do somthing by one * of phonestates. * * @author liao */
public
class
SAFLockPhoneCallListener
extends
PhoneStateListener
public
void
onCallStateChanged
(int state, String incomingNumber)
switch
// Phone in idle
case
"=============CALL_STATE_IDLE:================"
if
break
// Phone is hung up
case
"=============CALL_STATE_OFFHOOK:================"
break
// Cell phone ring
case
"=============CALL_STATE_RINGING:================"
break
default
"=============default:================"
break
private
Handler
mHandler
=
new
Handler
@Override
public
void
handleMessage
(Message msg)
switch
case
// ====read user customization
"saf.cmcc.lock.THEME_DEFAULT"
// keep the task running 2s in sleeping mode.
PowerManager
pm
=
// Keep the CPU running, and the screen and keyboard light may
// be closed.
WakeLock
mWakeLock
=
"SAFLock"
2000L
Intent
mLockScreenIntent
=
new
Intent
break
default
break
private
BroadcastReceiver
mScreenReceiver
=
new
BroadcastReceiver
@Override
public
void
onReceive
(Context context, Intent intent)
String
action
=
if
// load intent
if
// =====send message after a short delay
if
100
else
if
// ====remove unprocessed event.

目录

  1. Android 锁屏服务实现
  2. 功能概述
  3. 核心逻辑
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 中国 AI 大模型在巴黎奥运会应用及近期 AI 技术动态
  • 大模型项目实战经验:数据、模型与业务侧总结
  • AI 写作实战项目:自动写作助手设计与实现
  • Android Framework 开发价值与进阶路径深度解析
  • Ghostty + Yazi + Lazygit:构建现代化终端开发工作流
  • 双指针算法详解(上)
  • OpenClaw 在 Mac 上本地化部署及接入飞书教程
  • OpenClaw 开源 AI Agent 框架介绍与架构解析
  • CSS 颜色函数与渐变应用详解
  • Stable Diffusion 3.5 FP8 本地部署与实战指南
  • 使用 Gitee AI Serverless API 与 Cursor 搭建 DeepSeek 对话应用
  • Linux 中使用 Qwen Code CLI 工具
  • AI 大模型开发入门指南:学习路径与实战建议
  • Spring AI MCP Server 集成与源码解析
  • Python GUI 开发:Kivy 库详解与实战入门
  • 安路 FPGA 下载器驱动安装与测试指南
  • 护网行动详解:红蓝对抗机制与技术实践
  • AI Skills 详解:定义、机制与应用场景
  • Ubuntu 24.04 下使用 Docker Compose 本地部署 Whisper 语音识别
  • TCP 协议详解:报文结构、连接管理与流量控制

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online