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
相关产品推荐
相关产品推荐

