一、什么是全屏意图?
全屏意图是可以全屏启动并可用于显示全屏通知的意图。
好吧,我想这需要更多解释,所以继续阅读。
您的应用程序可能需要显示紧急的、时间敏感的消息,例如来电或闹钟铃声。在这些情况下,您可以将全屏意图与通知相关联。
二、为什么应该使用全屏意图?
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# setShowWhenLocked* (true)*方法
注意:为了能够打开屏幕,我们还需要使用以下命令请求它:
– 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
网友评论