Android 中使用通知(Kotlin 版)

1. 前置條件

  • Android Studio:確保使用最新版本(2023.3.1+)
  • 目標 API:最低 API 21,兼容 Android 8.0(渠道)和 13+(權限)
  • 依賴庫:使用 WorkManagerNotificationCompat

2. 完整實現步驟

2.1 添加權限和依賴

AndroidManifest.xml
<!-- 通知權限 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Android 13+ 必須 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 若需網絡請求 --><application><!-- 添加你的主 Activity --><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>
</application>
build.gradle (Module)
dependencies {// WorkManager 用于后臺任務implementation "androidx.work:work-runtime-ktx:2.7.1"// 通知兼容庫implementation "androidx.core:core-ktx:1.12.0"
}

2.2 創建通知渠道(Android 8.0+ 必需)

NotificationHelper.kt
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Buildobject NotificationHelper {const val CHANNEL_ID = "dynamic_messages_channel"const val NOTIFICATION_ID = 101 // 用于更新同一通知fun createNotificationChannel(context: Context) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {// 避免重復創建渠道val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagerif (notificationManager.getNotificationChannel(CHANNEL_ID) != null) return// 配置渠道屬性val name = "動態消息"val importance = NotificationManager.IMPORTANCE_HIGHval channel = NotificationChannel(CHANNEL_ID, name, importance).apply {description = "用于接收實時動態消息的推送"enableLights(true)lightColor = android.graphics.Color.RED}notificationManager.createNotificationChannel(channel)}}
}

2.3 構建動態通知

NotificationUtils.kt
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.example.myapp.R // 替換為你的包名object NotificationUtils {fun showDynamicNotification(context: Context,title: String,message: String) {// 創建點擊跳轉邏輯(示例跳轉到 MainActivity)val intent = Intent(context, MainActivity::class.java).apply {flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK}val pendingIntent = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)// 構建通知val builder = NotificationCompat.Builder(context, NotificationHelper.CHANNEL_ID).setSmallIcon(R.drawable.ic_notification) // 必須的圖標(需在 res/drawable 添加).setContentTitle(title).setContentText(message).setPriority(NotificationCompat.PRIORITY_HIGH).setContentIntent(pendingIntent).setAutoCancel(true) // 點擊后自動消失.setStyle(NotificationCompat.BigTextStyle().bigText(message)) // 長文本支持// 發送通知with(NotificationManagerCompat.from(context)) {if (NotificationManagerCompat.from(context).areNotificationsEnabled()) {notify(NotificationHelper.NOTIFICATION_ID, builder.build())}}}// 更新通知(使用相同 ID)fun updateNotification(context: Context, newTitle: String, newMessage: String) {val builder = NotificationCompat.Builder(context, NotificationHelper.CHANNEL_ID).setSmallIcon(R.drawable.ic_notification).setContentTitle(newTitle).setContentText(newMessage)NotificationManagerCompat.from(context).notify(NotificationHelper.NOTIFICATION_ID, builder.build())}
}

2.4 后臺任務調度(WorkManager)

NotificationWorker.kt
import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import kotlinx.coroutines.delayclass NotificationWorker(context: Context,params: WorkerParameters
) : CoroutineWorker(context, params) {override suspend fun doWork(): Result {// 模擬網絡請求延遲delay(3000)// 獲取動態數據(此處為模擬數據,實際需替換為真實邏輯)val title = "您有新的消息!"val content = "當前時間:${System.currentTimeMillis()}"// 顯示通知NotificationUtils.showDynamicNotification(applicationContext, title, content)return Result.success()}
}
調度任務(在 MainActivity 中)
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import java.util.concurrent.TimeUnitclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 初始化通知渠道NotificationHelper.createNotificationChannel(this)// 請求通知權限(Android 13+)requestNotificationPermission()// 啟動周期性后臺任務(每15分鐘一次)val workRequest = PeriodicWorkRequestBuilder<NotificationWorker>(15, TimeUnit.MINUTES // 注意:最短間隔為15分鐘).build()WorkManager.getInstance(this).enqueue(workRequest)}private fun requestNotificationPermission() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {if (checkSelfPermission(android.Manifest.permission.POST_NOTIFICATIONS) !=PackageManager.PERMISSION_GRANTED) {requestPermissions(arrayOf(android.Manifest.permission.POST_NOTIFICATIONS),REQUEST_CODE_NOTIFICATION)}}}companion object {private const val REQUEST_CODE_NOTIFICATION = 1001}
}

2.5 處理權限請求結果

MainActivity 中重寫 onRequestPermissionsResult

override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<String>,grantResults: IntArray
) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)when (requestCode) {REQUEST_CODE_NOTIFICATION -> {if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 用戶已授權} else {// 處理拒絕邏輯(例如顯示提示)}}}
}

3. 擴展優化建議

3.1 結合網絡請求

使用 Retrofit + Kotlin Coroutines 獲取真實數據:

// 在 NotificationWorker 中替換模擬數據
val response = apiService.fetchMessages()
if (response.isSuccessful) {val message = response.body()?.latestMessagemessage?.let {NotificationUtils.showDynamicNotification(context, it.title, it.content)}
}

3.2 通知分組(Android 7.0+)

val builder = NotificationCompat.Builder(...).setGroup("messages_group").setGroupSummary(true) // 分組摘要

3.3 通知操作按鈕

// 添加“標記已讀”操作
val readIntent = Intent(context, MarkReadReceiver::class.java)
val readPendingIntent = PendingIntent.getBroadcast(...)
builder.addAction(NotificationCompat.Action.Builder(R.drawable.ic_check,"標記已讀",readPendingIntent).build()
)

4. 常見問題解決

  1. 通知不顯示

    • 檢查是否在 Android 13+ 設備上授予了權限
    • 確保通知渠道已正確創建
    • 驗證 setSmallIcon 使用了有效的資源 ID
  2. 后臺任務不觸發

    • 確保 WorkManager 依賴已添加
    • 檢查設備是否處于 Doze 模式(測試時可暫時禁用)
  3. 通知點擊無響應

    • 確認 PendingIntentFLAG_IMMUTABLE 正確使用
    • 檢查目標 Activity 是否在 Manifest 中注冊

可進一步結合 Firebase Cloud Messaging (FCM) 實現服務端消息推送,或添加更復雜的交互邏輯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83436.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83436.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83436.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用大模型預測急性結石性疾病技術方案

目錄 1. 數據預處理與特征工程偽代碼 - 數據清洗與特征處理數據預處理流程圖2. 大模型構建與訓練偽代碼 - 模型訓練模型訓練流程圖3. 術前預測系統偽代碼 - 術前風險評估術前預測流程圖4. 術中實時調整系統偽代碼 - 術中風險預警術中調整流程圖5. 術后護理系統偽代碼 - 并發癥預…

每日Prompt:生成自拍照

提示詞 幫我生成一張圖片&#xff1a;圖片風格為「人像攝影」&#xff0c;請你畫一張及其平凡無奇的iPhone對鏡自拍照&#xff0c;主角是穿著JK風格cos服的可愛女孩&#xff0c;在自己精心布置的可按風格的房間內的落地鏡前用后置攝像頭隨手一拍的快照。照片開啟了閃光燈&…

動態規劃-64.最小路徑和-力扣(LetCode)

一、題目解析 從左上角到右下角使得數字總和最小且只能向下或向右移動 二、算法原理 1.狀態表示 我們需要求到達[i,j]位置時數字總和的最小值&#xff0c;所以dp[i][j]表示&#xff1a;到達[i,j]位置時&#xff0c;路徑數字總和的最小值。 2.狀態轉移方程 到達[i,j]之前要先…

LeetCode LCR 010 和為 K 的子數組 (Java)

兩種解法詳解&#xff1a;暴力枚舉與前綴和哈希表尋找和為k的子數組 在解決數組中和為k的連續子數組個數的問題時&#xff0c;我們可以采用不同的方法。本文將詳細解析兩種常見的解法&#xff1a;暴力枚舉法和前綴和結合哈希表的方法&#xff0c;分析它們的思路、優缺點及適用…

OpenVLA (2) 機器人環境和環境數據

文章目錄 [TOC](文章目錄) 前言1 BridgeData V21.1 概述1.2 硬件環境 2 數據集2.1 場景與結構2.2 數據結構2.2.1 images02.2.2 obs_dict.pkl2.2.3 policy_out.pkl 3 close question3.1 英偉達環境3.2 LIBERO 環境更適合仿真3.3 4090 運行問題 前言 按照筆者之前的行業經驗, 數…

深度學習(第3章——亞像素卷積和可形變卷積)

前言&#xff1a; 本章介紹了計算機識別超分領域和目標檢測領域中常常使用的兩種卷積變體&#xff0c;亞像素卷積&#xff08;Subpixel Convolution&#xff09;和可形變卷積&#xff08;Deformable Convolution&#xff09;&#xff0c;并給出對應pytorch的使用。 亞像素卷積…

大模型在腰椎間盤突出癥預測與治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景 1.2 研究目的與意義 二、腰椎間盤突出癥概述 2.1 定義與病因 2.2 癥狀與診斷方法 2.3 治療方法概述 三、大模型技術原理與應用基礎 3.1 大模型的基本原理 3.2 大模型在醫療領域的應用現狀 3.3 用于腰椎間盤突出癥預測的可行性分析 四、…

Vue3學習(組合式API——ref模版引用與defineExpose編譯宏函數)

目錄 一、ref模版引用。 &#xff08;1&#xff09;基本介紹。 &#xff08;2&#xff09;核心基本步驟。(以獲取DOM、組件為例) &#xff08;3&#xff09;案例&#xff1a;獲取dom對象演示。 <1>需求&#xff1a;點擊按鈕&#xff0c;讓輸入框聚焦。 &#xff08;4&…

公鏈開發及其配套設施:錢包與區塊鏈瀏覽器

公鏈開發及其配套設施&#xff1a;錢包與區塊鏈瀏覽器的技術架構與生態實踐 ——2025年區塊鏈基礎設施建設的核心邏輯與創新突破 一、公鏈開發&#xff1a;構建去中心化世界的基石 1. 技術架構設計的三重挑戰 公鏈作為開放的區塊鏈網絡&#xff0c;需在性能、安全性與去中心…

Kotlin 作用域函數(let、run、with、apply、also)對比

Kotlin 的 作用域函數&#xff08;Scope Functions&#xff09; 是簡化代碼邏輯的重要工具&#xff0c;它們通過臨時作用域為對象提供更簡潔的操作方式。以下是 let、run、with、apply、also 的對比分析&#xff1a; 一、核心區別對比表 函數上下文對象引用返回值是否擴展函數…

14、Python時間表示:Unix時間戳、毫秒微秒精度與time模塊實戰

適合人群&#xff1a;零基礎自學者 | 編程小白快速入門 閱讀時長&#xff1a;約5分鐘 文章目錄 一、問題&#xff1a;計算機中的時間的表示、Unix時間點&#xff1f;1、例子1&#xff1a;計算機的“生日”&#xff1a;Unix時間點2、答案&#xff1a;&#xff08;1&#xff09;U…

AI日報 - 2024年5月17日

&#x1f31f; 今日概覽 (60秒速覽) ▎&#x1f916; 大模型前沿 | OpenAI推出自主編碼代理Codex&#xff1b;Google DeepMind發布Gemini驅動的編碼代理AlphaEvolve&#xff0c;能設計先進算法&#xff1b;Meta旗艦AI模型Llama 4 Behemoth發布推遲。 Codex能并行處理多任務&…

DriveMM:用于自動駕駛的一體化大型多模態模型——論文閱讀

《DriveMM: All-in-One Large Multimodal Model for Autonomous Driving》2024年12月發表&#xff0c;來自中山大學深圳分校和美團的論文。 大型多模態模型&#xff08;LMM&#xff09;通過整合大型語言模型&#xff0c;在自動駕駛&#xff08;AD&#xff09;中表現出卓越的理解…

C++_STL_map與set

1. 關聯式容器 在初階階段&#xff0c;我們已經接觸過STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;這些容器統稱為序列式容器&#xff0c;因為其底層為線性序列的數據結構&#xff0c;里面 存儲的是元素本身。那什么是…

【嵌入式開發-RGB 全彩 LED】

嵌入式開發-RGB 全彩 LED ■ RGB 全彩 LED簡介■ 電路設計■ ■ RGB 全彩 LED簡介 RGB 全彩 LED 模塊顯示不同的顏色。 ■ 電路設計 全彩 LED 使用 PA5、 藍色&#xff08;B&#xff09; TIM2_CHN3 PA1、 綠色&#xff08;G&#xff09;TIM2_CHN2 PA2、 紅色&#xff08;R&am…

計算機網絡:手機和基站之間的通信原理是什么?

手機與基站之間的通信是無線通信技術的核心應用之一,涉及復雜的物理層傳輸、協議交互和網絡管理機制。以下從技術原理、通信流程和關鍵技術三個層面深入解析這一過程: 一、蜂窩網絡基礎架構 1. 蜂窩結構設計 基本原理:將服務區域劃分為多個六邊形“蜂窩小區”,每個小區由*…

【Docker】Docker安裝RabbitMQ

目錄 1.拉取鏡像 2. 創建掛載目錄 3.創建和啟動 4.登錄管理端 1.拉取鏡像 推薦使用帶 Web 管理界面的官方鏡像&#xff08;management&#xff09; # 拉取docker鏡像 docker pull rabbitmq:management響應內容&#xff1a; 2. 創建掛載目錄 創建掛載目錄和日志目錄 #rabb…

交叉編譯源碼的方式移植ffmpeg-rockchip

獲取ffmpeg源碼 git submodule add -f https://github.com/FFmpeg/FFmpeg.git thirdparty/FFmpeg 瑞芯微ffmpeg-rk git clone https://github.com/jjm2473/ffmpeg-rk/tree/enc# 參考的一位博主的說法 使用 ffmpeg-rochip 的好處 傳統的使用硬件編解碼的開發思路是&#xf…

9.0 C# 調用solidworks介紹1

一、C# 與 SolidWorks 聯合開發概述 SolidWorks 提供了完整的 API(應用程序接口),允許開發者使用 C# 等編程語言進行二次開發,實現自動化設計、定制功能等。 主要技術要點包括: 1. API 結構:SolidWorks API 是基于 COM 的接口,包含數百個對象和數千個方法…

AD 多層線路及裝配圖PDF的輸出

裝配圖的輸出&#xff1a; 1.點開‘智能PDF’ 2. 設置顯示頂層&#xff1a; 設置顯示底層&#xff1a; 多層線路的輸出 同樣使用‘智能PDF’