最近一直在學習Kotlin桌面端架構TornadoFx的使用,沒怎麼寫筆記了,使用kotlin開發桌面應用很棒啊,有空一定寫個記錄,其中還有JavaFx的Jfoenix的Material設計的UI庫在TornadoFx簡直無縫使用。哈哈。
進入正題,在社群看到有人說有沒有鎖屏備忘錄的應用,就花點時間寫了個android的。
然後遇到了:android8.0的通知适配,主要是通知的通道與分組,前者控制在高版本裝置上是否顯示通知,後者控制如果來自一個應用超過三個通知,會折疊,我們要把這個折疊禁止,最後就是如何保持Service一直不被背景清理。
首先我們先建立一個通知管理:判斷版本記得,低版本的裝置不需要channelId,這是新版本的規定,必須設定通道ID,這裡我設定了三個不同的Id,為了後面不被折疊。
mNm = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mNm.createNotificationChannels(listOf( NotificationChannel(
"lockTodo1",
"Todo1",
NotificationManager.IMPORTANCE_HIGH
), NotificationChannel(
"lockTodo2",
"Todo2",
NotificationManager.IMPORTANCE_HIGH
), NotificationChannel(
"lockTodo3",
"Todo3",
NotificationManager.IMPORTANCE_HIGH
), NotificationChannel(
"notifyTodo",
"TodoTop",
NotificationManager.IMPORTANCE_HIGH
)))
}
然後我們建立一個通知看看:注意看setGroupSummary我們設定為False就不會折疊了。
設定顯示等級:visibility這裡可以設定是否鎖屏顯示。
val notifyBuild = NotificationCompat.Builder([email protected], "lockTodo${i.key}")
//設定通知标題
.setContentTitle("${todoList["${i.key.toInt() - 1 }"]?:"預設todo"}")
//設定通知内容
// .setContentText("請繼續保持哦!")
.setAutoCancel(true)
.setGroup("todos")
.setGroupSummary(false)
.setContentIntent(pi)
.setLargeIcon(BitmapFactory.decodeResource(context?.resources,R.drawable.notify))
.setSmallIcon(R.drawable.launch)
.setShowWhen(true).build().apply {
visibility = Notification.VISIBILITY_PUBLIC
}
然後我們發出這個通知:第一個是通知id和通道id不一樣的注意!
mNm.notify(500.plus(i.key.toInt()), notifyBuild)
然後就是通知一般我們都是service發出的,如何保持service一直運作呢
1.提高service優先級
2.從最近任務清單移除應用,防止主程式被殺掉
在主activity設定
android:excludeFromRecents="true"
3.開啟前台通知(目前這個可以保持非常久,基本就是可見應用狀态了,優先級很高)
這裡開啟前台服務,通知會一直出現在狀态上,比如顯示xx正在運作,你可以自定義的,修改notification内容就不寫了。
startForeground(0x11,notifyBuildPre)
還有權限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
酷安傳送門:鎖屏備忘錄