You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio:闹钟触发时如何解锁屏幕并跳转至指定Activity

通过BroadcastReceiver.onReceive解锁屏幕并启动指定Activity的实现

可以实现,但需适配不同Android版本的权限限制,尤其是Android 10(API 29)及以上的系统限制,具体实现步骤如下:

1. 声明必要权限

在AndroidManifest.xml中添加所需权限:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- Android 13+ 若需通过通知触发广播,需添加POST_NOTIFICATIONS权限 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" android:minSdkVersion="33" />

2. 实现BroadcastReceiver的onReceive逻辑

根据Android版本差异处理解锁和启动逻辑:

@Override
public void onReceive(Context context, Intent intent) {
    // 唤醒屏幕
    PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wakeLock = powerManager.newWakeLock(
        PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE,
        "MyApp:WakeLockTag"
    );
    wakeLock.acquire(10000); // 持有10秒,确保完成操作

    KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
    Intent launchIntent = new Intent(context, FirstActivity.class);
    launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        // Android 10+ 无法直接解锁系统锁屏,启动全屏Activity覆盖锁屏
        launchIntent.addFlags(Intent.FLAG_SHOW_WHEN_LOCKED | Intent.FLAG_DISMISS_KEYGUARD);
        context.startActivity(launchIntent);
    } else {
        // Android P及以下,直接解锁锁屏
        if (keyguardManager.isKeyguardLocked()) {
            KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("MyApp:KeyguardLockTag");
            keyguardLock.disableKeyguard();
            context.startActivity(launchIntent);
            // 可选:操作完成后重新启用锁屏
            keyguardLock.reenableKeyguard();
        } else {
            context.startActivity(launchIntent);
        }
    }

    // 释放唤醒锁
    if (wakeLock.isHeld()) {
        wakeLock.release();
    }
}

3. 配置目标Activity

在AndroidManifest.xml中给FirstActivity添加基础属性:

<activity
    android:name=".FirstActivity"
    android:turnScreenOn="true">
    <!-- Android 9及以下可添加showOnLockScreen属性 -->
    <!-- android:showOnLockScreen="true" -->
</activity>

同时在FirstActivity的onCreate方法中添加窗口标记,确保锁屏时正常显示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().addFlags(
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
    );
    setContentView(R.layout.activity_first);
}

关键注意事项

  • Android 10及以上系统限制了DISABLE_KEYGUARD权限,无法直接解锁系统锁屏,只能通过全屏Activity覆盖,用户仍需手动解锁系统锁屏(设备所有者应用除外)
  • 唤醒锁需及时释放,避免不必要的耗电
  • 确保广播接收器注册正确(静态或动态),能接收到触发广播
  • Android 12及以上部分机型可能需额外适配窗口标记的权限

内容的提问来源于stack exchange,提问作者Orl13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:04:49