美文网首页
全屏意图通知 - Android

全屏意图通知 - Android

作者: NeWolf | 来源:发表于2024-03-07 11:57 被阅读0次

    一、什么是全屏意图?

    全屏意图是可以全屏启动并可用于显示全屏通知的意图。
    好吧,我想这需要更多解释,所以继续阅读。

    您的应用程序可能需要显示紧急的、时间敏感的消息,例如来电或闹钟铃声。在这些情况下,您可以将全屏意图与通知相关联。

    二、为什么应该使用全屏意图?

    Android Q 添加了一项限制,即应用程序如果不满足条件则无法启动活动。虽然这破坏了很多东西,但它并不影响全屏意图。(请参阅从后台启动活动的限制

    Android Toolkit 团队的Ian Lake在Stackoverflow 的一个问题上说道:

    自 API 9 中引入以来,全屏意图一直是建议的警报最佳实践,并且随着平视通知的引入而变得更加重要(如果用户正在积极使用其设备,则警报将显示为平视通知)

    三、什么时候应该使用全屏意图?

    全屏意图永远被添加到框架中,这是在系统锁定或繁忙时启动活动的推荐方式。

    例如:

    • 来电:当有来电时,如果手机处于锁定状态,系统会启动全屏活动或显示高优先级的普通通知。
    • 闹钟:闹钟可以使用全屏意图来显示高优先级的活动或通知。
      具有全屏意图的通知对用户的干扰较小,并且将来因任何 API 更改而中断的机会也较小

    四、来写一个全屏意图的Demo

    注意:在 Android 10 及更高版本上要使用全屏 Intent,需要在 Manifest 中声明特殊权限。full-screen-intent

    我们将探索三种不同的场景:

    1.当应用程序位于前台时发出通知
    2.安排全屏意图通知
    3.使用键盘锁锁定屏幕上的全屏意图
    免责声明:出于演示目的,将省略一些逻辑

    1. 当应用程序在前台时通知。

    在前台显示全屏意图通知

    动态效果

    为了显示全屏意图,我们需要首先构建通知并将全屏意图设置为通知

    为了构建意图,我们需要一个待处理的意图,这可以使用PendingIntent来实现。

    val builder = NotificationCompat.Builder(this, channelId) 
            .setSmallIcon(android.R.drawable.arrow_up_float) 
            .setContentTitle(title) 
            .setContentText(description) 
            .setPriority(NotificationCompat.PRIORITY_HIGH) 
    
    // 出于演示目的未添加请求代码和标志
    valendingIntent = PendingIntent.getActivity(this, 0, Intent, 0) 
    
    builder.setFullScreenIntent(pendingIntent) // 这是全屏意图
    

    不要忘记在 AndroidManifest.xml 的 Activity 中添加以下内容:

    <activity android:name=".LockScreenActivity" 
        android:showOnLockScreen="true"/>
    

    2.安排全屏意图通知

    动态效果

    调度

    AlarmManager 需要一个带有 BroadcastReceiver 的 PendingIntent。

    fun Context.scheduleNotification(isLockScreen: Boolean) { 
        val AlarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager 
        val timeInMillis = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(SCHEDULE_TIME) 
    
        with(alarmManager) { 
            setExact(AlarmManager.RTC_WAKEUP, timeInMillis) , getReceiver(isLockScreen)) 
        } 
    } 
    
    private fun Context.getReceiver(isLockScreen: Boolean): PendingIntent { 
        // 出于演示目的,没有请求代码,也没有标志
        return PendingIntent.getBroadcast( 
            this, 
            0, 
            NotificationReceiver.build(this, isLockScreen), 
            0 
        ) 
    }
    

    接收者

    下面的接收者在两种情况下被调用:

    • 当系统被锁定时
    • 当系统未锁定时
    class NotificationReceiver : BroadcastReceiver() { 
    
        override fun onReceive(context: Context, Intent: Intent) { 
            if(intent.getBooleanExtra(LOCK_SCREEN_KEY, true)) { 
                context.showNotificationWithFullScreenIntent(true) 
            } else { 
                context.showNotificationWithFullScreenIntent() 
            } 
        }
    
        伴随对象{ 
            fun build(context: Context, isLockScreen: Boolean): Intent { 
                return Intent(context, notificationReceiver::class.java).also { 
                    it.putExtra(LOCK_SCREEN_KEY, isLockScreen) 
                } 
            } 
        } 
    } 
    
    private const val LOCK_SCREEN_KEY = "lockScreenKey"
    

    3.带锁屏的全屏意图锁屏

    键盘锁可以阻止显示通知。

    动态效果

    该框架提供了一些标志来关闭键盘保护。

    注意:为了能够打开屏幕,我们还需要使用以下命令请求它:
    – Activity# setTurnScreenOn (true) 方法

    是时候使用一个扩展函数来设置两个具有向后兼容性的标志了🚀

    fun Activity.turnScreenOnAndKeyguardOff() { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { 
            setShowWhenLocked(true) 
            setTurnScreenOn(true) 
        } else { 
            window.addFlags( 
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        或 WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 
            ) 
        } 
    
        with(getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager) { 
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 
                requestDismissKeyguard(this@turnScreenOnAndKeyguardOff, null) 
            } 
        } 
    }
    

    展示效果

    动态效果

    五、结论

    使用全屏意图很简单,这是启动活动的推荐方式,尤其是对于警报。

    该 API 应谨慎使用,开发人员不应滥用它,因为它具有相当的侵入性,尤其是在屏幕唤醒时。

    六、实例代码

    Full-Screen Intent Notification Example

    End

    该文字转载自:https://medium.com/android-news/full-screen-intent-notifications-android-85ea2f5b5dc1

    相关文章

      网友评论

          本文标题:全屏意图通知 - Android

          本文链接:https://www.haomeiwen.com/subject/fsbszdtx.html