Android 锁屏服务实现
功能概述
该服务类主要处理屏幕开关广播及电话状态监听。启动后首先注册接受屏幕的关闭和开启的广播,在广播中处理开屏锁屏任务;获取电话管理服务,注册通话状态监听,监听手机响铃状态、挂起状态、空闲状态,以 Handler 方式执行不同的任务。
核心逻辑
- 屏幕监听:注册
ACTION_SCREEN_OFF和ACTION_SCREEN_ON广播。 - 电话监听:使用
PhoneStateListener监听通话状态变化。 - 锁屏控制:通过
KeyguardManager禁用或启用锁屏。 - 任务调度:利用
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;
private 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);
}
}
};
}

