欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Notification通知使用詳解

 更新時(shí)間:2022年09月08日 08:56:19   作者:愿天深海  
消息通知(Notification)是Android系統(tǒng)中比較有特色的一個(gè)功能,當(dāng)某個(gè)應(yīng)用程序希望用戶發(fā)出一些提示信息,而該應(yīng)用又不在前臺(tái)運(yùn)行時(shí),就可以借助通知來(lái)實(shí)現(xiàn)

在Android應(yīng)用的開發(fā)中,必然會(huì)遇上通知的開發(fā)需求,本文主要講一下Android中的通知 Notification的簡(jiǎn)單基本使用,主要包含創(chuàng)建通知渠道、初始化通知、顯示通知、顯示圖片通知、通知點(diǎn)擊、以及配合WorkManager發(fā)送延遲通知。

Demo下載

創(chuàng)建通知渠道

首先,創(chuàng)建幾個(gè)常量和變量,其中渠道名是會(huì)顯示在手機(jī)設(shè)置-通知里app對(duì)應(yīng)展示的通知渠道名稱,一般基于通知作用取名。

    companion object {
        //渠道Id
        private const val CHANNEL_ID = "渠道Id"
        //渠道名
        private const val CHANNEL_NAME = "渠道名-簡(jiǎn)單通知"
        //渠道重要級(jí)
        private const val CHANNEL_IMPORTANCE = NotificationManager.IMPORTANCE_DEFAULT
    }
    private lateinit var context: Context
    //Notification的ID
    private var notifyId = 100
    private lateinit var manager: NotificationManager
    private lateinit var builder: NotificationCompat.Builder

然后獲取系統(tǒng)通知服務(wù),創(chuàng)建通知渠道,其中因?yàn)橥ㄖ朗茿ndroid8.0才有的,所以增加一個(gè)版本判斷:

        //獲取系統(tǒng)通知服務(wù)
        manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        //創(chuàng)建通知渠道,Android8.0及以上需要
        createChannel()
    private fun createChannel() {
        //創(chuàng)建通知渠道,Android8.0及以上需要
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            return
        }
        val notificationChannel = NotificationChannel(
            CHANNEL_ID,
            CHANNEL_NAME,
            CHANNEL_IMPORTANCE
        )
        manager.createNotificationChannel(notificationChannel)
    }

初始化通知

先生成NotificationCompat.Builder,然后初始化通知Builder的通用配置:

        builder = NotificationCompat.Builder(context.applicationContext, CHANNEL_ID)
        initNotificationBuilder()
    /**
     * 初始化通知Builder的通用配置
     */
    private fun initNotificationBuilder() {
        builder
            .setAutoCancel(true) //設(shè)置這個(gè)標(biāo)志當(dāng)用戶單擊面板就可以讓通知自動(dòng)取消
            .setSmallIcon(R.drawable.ic_reminder) //通知的圖標(biāo)
            .setWhen(System.currentTimeMillis()) //通知產(chǎn)生的時(shí)間,會(huì)在通知信息里顯示
            .setDefaults(Notification.DEFAULT_ALL)
    }

此外builder還有setVibrate、setSound、setStyle等方法,按需配置即可。

顯示通知

給builder設(shè)置需要通知需要顯示的title和content,然后通過(guò)builder.build()生成生成通知Notification,manager.notify()方法將通知發(fā)送出去。

    fun configNotificationAndSend(title: String, content: String){
        builder.setContentTitle(title)
            .setContentText(content)
        val notification = builder.build()
        //發(fā)送通知
        manager.notify(notifyId, notification)
        //id自增
        notifyId++
    }

最簡(jiǎn)單的通知顯示至此上面三步就完成了。

效果如下圖:

顯示圖片通知

當(dāng)通知內(nèi)容過(guò)多一行展示不下時(shí),可以通過(guò)設(shè)置

builder.setStyle(NotificationCompat.BigTextStyle().bigText(content)) //設(shè)置可以顯示多行文本

這樣通知就能收縮和展開,顯示多行文本。

另外setStyle還可以設(shè)置圖片形式的通知:

setStyle(NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(resources,R.drawable.logo)))//設(shè)置圖片樣式

效果如下圖:

通知點(diǎn)擊

目前為止的通知還只是顯示,因?yàn)樵O(shè)置了builder.setAutoCancel(true),點(diǎn)擊通知之后通知會(huì)自動(dòng)消失,除此之外還沒(méi)有其他操作。

給builder設(shè)置setContentIntent(PendingIntent)就能有通知點(diǎn)擊之后的其他操作了。PendingIntent可以看作是對(duì)Intent的一個(gè)封裝,但它不是立刻執(zhí)行某個(gè)行為,而是滿足某些條件或觸發(fā)某些事件后才執(zhí)行指定的行為。PendingIntent獲取有三種方式:Activity、Service和BroadcastReceiver獲取。通過(guò)對(duì)應(yīng)方法PendingIntent.getActivity、PendingIntent.getBroadcast、PendingIntent.getService就能獲取。

這里就示例一下PendingIntent.getBroadcast和PendingIntent.getActivity

PendingIntent.getBroadcast

首先創(chuàng)建一個(gè)BroadcastReceiver:

class NotificationHandleReceiver : BroadcastReceiver() {
    companion object {
        const val NOTIFICATION_HANDLE_ACTION = "notification_handle_action"
        const val NOTIFICATION_LINK = "notificationLink"
        const val TAG = "NotificationReceiver"
    }
    override fun onReceive(context: Context, intent: Intent?) {
        if (intent?.action == NOTIFICATION_HANDLE_ACTION) {
            val link = intent.getStringExtra(NOTIFICATION_LINK)
        }
    }
}

別忘了在清單文件中還需要靜態(tài)注冊(cè)BroadcastReceiver:

    <receiver
        android:name=".NotificationHandleReceiver"
        android:exported="false">
        <intent-filter>
            <action android:name="notification_handle_action" />
        </intent-filter>
    </receiver>

然后創(chuàng)建一個(gè)上面BroadcastReceiver的Intent,在intent.putExtra傳入相應(yīng)的點(diǎn)擊通知之后需要識(shí)別的操作:

   fun generateDefaultBroadcastPendingIntent(linkParams: (() -> String)?): PendingIntent {
        val intent = Intent(NotificationHandleReceiver.NOTIFICATION_HANDLE_ACTION)
        intent.setPackage(context.packageName)
        linkParams?.let {
            val params = it.invoke()
            intent.putExtra(NotificationHandleReceiver.NOTIFICATION_LINK, params)
        }
        return PendingIntent.getBroadcast(
            context,
            notifyId,
            intent,
            PendingIntent.FLAG_IMMUTABLE
        )
    }

這樣生成的PendingIntent再builder.setContentIntent(pendingIntent),在我們點(diǎn)擊通知之后,NotificationHandleReceiver的onReceive里就會(huì)收到信息了,根據(jù)信息處理后續(xù)操作即可。

PendingIntent.getActivity

Activity的PendingIntent用于跳轉(zhuǎn)到指定activity,創(chuàng)建一個(gè)跳轉(zhuǎn)activity的Intent(同普通的頁(yè)面跳轉(zhuǎn)的Intent),也是同上面在intent.putExtra傳入相應(yīng)的點(diǎn)擊通知之后需要識(shí)別的操作:

        val intent = Intent(this, XXXX::class.java).apply {
            putExtra("title", title).putExtra("content", content)
        }
        return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)

也是這樣生成的PendingIntent再builder.setContentIntent(pendingIntent),在我們點(diǎn)擊通知之后,就會(huì)跳轉(zhuǎn)到對(duì)應(yīng)的activity頁(yè)面,然后intent里就會(huì)收到信息了,根據(jù)信息處理后續(xù)操作即可。

Android12之PendingIntent特性

行為變更:以 Android 12 為目標(biāo)平臺(tái)的應(yīng)用

查看上面關(guān)于Android12的特性

在Android12平臺(tái)上有關(guān)于PendingIntent的兩點(diǎn)特性:

一是待處理 intent 可變性,必須為應(yīng)用創(chuàng)建的每個(gè)PendingIntent對(duì)象指定可變性,這也是上面創(chuàng)建PendingIntent時(shí)需要設(shè)置flag為PendingIntent.FLAG_IMMUTABLE。

二是通知 trampoline 限制,以 Android 12 或更高版本為目標(biāo)平臺(tái)的應(yīng)用無(wú)法從用作通知 trampoline 的服務(wù)廣播接收器中啟動(dòng) activity。換言之,當(dāng)用戶點(diǎn)按通知或通知中的操作按鈕時(shí),您的應(yīng)用無(wú)法在服務(wù)或廣播接收器內(nèi)調(diào)用startActivity()。所以當(dāng)需要點(diǎn)擊通知實(shí)現(xiàn)activity跳轉(zhuǎn)時(shí),需要使用PendingIntent. getActivity,而不是使用PendingIntent.getBroadcast,然后在BroadcastReceiver里實(shí)現(xiàn)activity跳轉(zhuǎn),后者方式在Android 12 或更高版本為目標(biāo)平臺(tái)的應(yīng)用中將被限制。

配合WorkManager發(fā)送延遲通知

配合上WorkManager,就能實(shí)現(xiàn)發(fā)送延遲通知,主要是通過(guò)OneTimeWorkRequest的延遲特性。

創(chuàng)建一個(gè)延遲的OneTimeWorkRequest,加入WorkManager隊(duì)列中:

    fun sendWorkRequest(
        context: Context,
        reminderId: Int,
        title: String,
        content: String,
        link: String,
        triggerTime: Long
    ): OneTimeWorkRequest {
        val duration = triggerTime - System.currentTimeMillis()
        val data =
            Data.Builder().putInt(REMINDER_WORKER_DATA_ID, reminderId).putString(REMINDER_WORKER_DATA_TITLE, title)
                .putString(REMINDER_WORKER_DATA_CONTENT, content).putString(REMINDER_WORKER_DATA_LINK, link)
                .build()
        val uniqueWorkName =
            "reminderData_${reminderId}"
        val request = OneTimeWorkRequest.Builder(ReminderWorker::class.java)
            .setInitialDelay(duration, TimeUnit.MILLISECONDS)
            .setInputData(data)
            .build()
        WorkManager.getInstance(context)
            .enqueueUniqueWork(uniqueWorkName, ExistingWorkPolicy.REPLACE, request)
        return request
    }

然后在doWork方法中拿到數(shù)據(jù)進(jìn)行我們上面的通知發(fā)送顯示即可。具體關(guān)于OneTimeWorkRequest的使用在本文中就不詳細(xì)說(shuō)明了。當(dāng)需要發(fā)送延遲通知時(shí),知道可以通過(guò)配合WorkManager實(shí)現(xiàn)。

Android13 通知權(quán)限

在目前最新的Android 13(API 級(jí)別 33)上對(duì)于通知增加了權(quán)限限制,具體可看官方描述:

通知運(yùn)行時(shí)權(quán)限

到此這篇關(guān)于Android Notification通知使用詳解的文章就介紹到這了,更多相關(guān)Android Notification內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Flutter路由的跳轉(zhuǎn)、動(dòng)畫和傳參詳解(最簡(jiǎn)單)

    Flutter路由的跳轉(zhuǎn)、動(dòng)畫和傳參詳解(最簡(jiǎn)單)

    這篇文章主要給大家介紹了關(guān)于Flutter路由的跳轉(zhuǎn)、動(dòng)畫和傳參的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Android中實(shí)現(xiàn)淘寶購(gòu)物車RecyclerView或LIstView的嵌套選擇的邏輯

    Android中實(shí)現(xiàn)淘寶購(gòu)物車RecyclerView或LIstView的嵌套選擇的邏輯

    這篇文章主要介紹了Android中實(shí)現(xiàn)淘寶購(gòu)物車RecyclerView或LIstView的嵌套選擇的邏輯,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • Android權(quán)限如何禁止以及友好提示用戶開通必要權(quán)限詳解

    Android權(quán)限如何禁止以及友好提示用戶開通必要權(quán)限詳解

    這篇文章主要給大家介紹了關(guān)于Android權(quán)限如何禁止以及友好提示用戶開通必要權(quán)限的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Android顯式Intent與隱式Intent的使用詳解

    Android顯式Intent與隱式Intent的使用詳解

    Intent的中文意思是“意圖,意向”, Intent對(duì)Android的核心和靈魂,是各組件之間的橋梁。四大組件分別為Activity 、Service、BroadcastReceiver、ContentProvider。而這四種組件是獨(dú)立的,它們之間可以互相調(diào)用,協(xié)調(diào)工作,最終組成一個(gè)真正的Android應(yīng)用
    2022-09-09
  • Android framework ATMS啟動(dòng)流程

    Android framework ATMS啟動(dòng)流程

    這篇文章主要為大家介紹了Android framework ATMS啟動(dòng)流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Android開發(fā)之對(duì)話框案例詳解(五種對(duì)話框)

    Android開發(fā)之對(duì)話框案例詳解(五種對(duì)話框)

    本文通過(guò)實(shí)例代碼給大家分享了5種android對(duì)話框,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09
  • 自定義搜索功能Android實(shí)現(xiàn)

    自定義搜索功能Android實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了自定義搜索功能,由Android代碼實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2016-05-05
  • 超過(guò)百萬(wàn)的StackOverflow Flutter 20大問(wèn)題(推薦)

    超過(guò)百萬(wàn)的StackOverflow Flutter 20大問(wèn)題(推薦)

    這篇文章主要介紹了超過(guò)百萬(wàn)的StackOverflow Flutter 問(wèn)題,有的問(wèn)題在stackoverflow上有幾十萬(wàn)的閱讀量,說(shuō)明很多人都遇到了這些問(wèn)題,把這些問(wèn)題整理分享給大家需要的朋友可以參考下
    2020-04-04
  • Android自定義View之酷炫數(shù)字圓環(huán)

    Android自定義View之酷炫數(shù)字圓環(huán)

    這篇文章主要為大家詳細(xì)介紹了Android自定義View之酷炫數(shù)字圓環(huán),實(shí)現(xiàn)效果很酷,,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 去掉RecycleView或者ListView上下滑動(dòng)陰影的方法

    去掉RecycleView或者ListView上下滑動(dòng)陰影的方法

    下面小編就為大家分享一篇去掉RecycleView或者ListView上下滑動(dòng)陰影的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論