一、什么是全屏意图?
全屏意图是可以全屏启动并可用于显示全屏通知的[意图。]
好吧,我想这需要更多解释,所以继续阅读。
二、为什么应该使用全屏意图?
[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进阶资料
敲代码不易,关注一下吧。ღ( ´・ᴗ・` )