全屏意图通知 - Android

一、什么是全屏意图?

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

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

[Android Q 添加了一项限制,即应用程序如果不满足条件]

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

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

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

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

例如:

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

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

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

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

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

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

在前台显示全屏意图通知

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

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.带锁屏的全屏意图锁屏

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

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

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 应谨慎使用,开发人员不应滥用它,因为它具有相当的侵入性,尤其是在屏幕唤醒时。

如果你看到了这里,觉得文章写得不错就给个赞呗?
更多Android进阶指南 可以扫码 解锁更多Android进阶资料


在这里插入图片描述
敲代码不易,关注一下吧。ღ( ´・ᴗ・` )

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值