You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 14设备(三星Z-Flip 6)应用未运行时全屏通知无法在锁屏显示

Android 14设备(三星Z-Flip 6)应用未运行时全屏通知无法在锁屏显示

嘿,我太懂你这种摸不着头脑的感觉了——全屏Intent在Android 14尤其是三星定制系统上确实藏着不少坑,特别是App没运行、设备还锁屏的场景,简直是双重考验。先别急,咱们对着你的需求和触发流程一步步捋,看看哪里可能卡壳了。

先明确下你的核心需求:做一款闹钟应用,当闹钟触发时,要在设备锁定、App完全未运行的状态下,唤起全屏界面,同时让屏幕逐渐变亮、播放自然音效。你的触发流程是用AlarmManager触发BroadcastReceiver,接下来应该是要从这里启动全屏Intent对吧?那问题大概率出在权限、启动方式,还有三星OneUI的特殊限制上,咱们一个个说:

  • 先把Android 14要求的权限补全
    Android 14对全屏Intent的权限卡得特别严,你得先在Manifest里声明USE_FULL_SCREEN_INTENT权限,而且必须在运行时请求POST_NOTIFICATIONS权限——别觉得奇怪,哪怕你不想在通知栏显示内容,全屏Intent本质上还是和通知系统绑定的,这个权限是绕不开的。
    比如在Manifest里加这段:

    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
    

    然后在App第一次启动的时候,记得弹框请求通知权限,不然后台触发的全屏Intent根本走不通。

  • 别直接在BroadcastReceiver里启动Activity!用通知绑定全屏Intent才是正确姿势
    因为App未运行时,BroadcastReceiver是在后台进程里的,Android 14严打后台直接启动Activity的行为。你得把全屏Intent绑定到一个高优先级的通知上,通过NotificationManager发送,系统才会允许它在锁屏时唤起全屏界面。
    给你个参考的代码逻辑:

    1. 先创建指向全屏闹钟Activity的Intent,加上必要的Flag:
      Intent alarmIntent = new Intent(context, AlarmFullScreenActivity.class);
      alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
      
    2. 把Intent包装成PendingIntent:
      PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(context, alarmId, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
      
    3. 构建一个高优先级的闹钟类通知,把全屏Intent设置进去:
      Notification notification = new NotificationCompat.Builder(context, ALARM_CHANNEL_ID)
          .setSmallIcon(R.drawable.ic_alarm)
          .setContentTitle("你的闹钟响啦")
          .setContentText("该起床拥抱自然啦~")
          .setPriority(NotificationCompat.PRIORITY_HIGH)
          .setCategory(NotificationCompat.CATEGORY_ALARM)
          .setFullScreenIntent(fullScreenPendingIntent, true)
          .build();
      
    4. 最后用NotificationManagerCompat发送这个通知就行,系统会自动处理全屏唤起的逻辑。
  • 三星Z-Flip 6的OneUI得单独加白名单
    三星的定制系统对后台应用限制特别狠,尤其是省电模式和深度睡眠。你得确保你的App没被系统限流:

    1. 打开手机设置,找到你的应用,进入「电池」设置,关闭「省电模式」,开启「允许后台活动」和「允许唤醒设备」;
    2. 再去应用的「通知」设置里,手动打开「在锁屏上显示内容」的开关,不然哪怕系统允许全屏Intent,三星的锁屏也会把它挡住。
  • 全屏Activity的配置也不能少
    你的闹钟全屏Activity得做针对性配置,才能在锁屏时正常显示:
    在Manifest里给这个Activity加上这些属性:

    <activity
        android:name=".AlarmFullScreenActivity"
        android:showOnLockScreen="true"
        android:showWhenLocked="true"
        android:turnScreenOn="true"
        android:excludeFromRecents="true"
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:exported="true" />
    

    另外在Activity的onCreate方法里,再加一段代码确保能唤醒屏幕、解锁(如果需要的话):

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
        setShowWhenLocked(true);
        setTurnScreenOn(true);
        KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        keyguardManager.requestDismissKeyguard(this, null);
    } else {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
                            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
                            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    }
    

你可以按照这个顺序排查,先补权限、改全屏Intent的启动方式,这两个是最容易踩的坑,要是还不行再检查三星的系统设置,应该就能解决问题啦!

备注:内容来源于stack exchange,提问作者Carolin Pfennig

火山引擎 最新活动