天天看點

Kotlin安卓開發:notification通知的适配

最近一直在學習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"/>
           
Kotlin安卓開發:notification通知的适配

酷安傳送門:鎖屏備忘錄