Android入門(14)| 通知

文章目錄

  • 創建通知
  • 點擊效果
  • 其它小功能
  • 實例


創建通知

創建通知的步驟:

  1. 管理通知的 NotificationManager,通常通過當前 ContextgetSystemService() 獲取實例。它接受一個字符串參數用于確定獲取系統的什么服務。
  2. Android 8.0(O) 版本后需要通知通道(通知類別) Notificationchannel 以細致化管理通知。
  3. 使用 Builder構造器 來創建 Notification對象。可以使用 support庫 提供的 NotificationCompat類 中的 Builder 來兼容不同 Android 版本。
  4. 通過 NotificationManager.notify() 顯示通知,該方法有兩個參數:
    1. 每個通知都不同的 id;
    2. Notification對象。

點擊效果

此時點擊該通知沒有什么反應,這需要通過 PendingIntent 實現點擊通知后的意圖。它類似于 Intent ,可以啟動活動、服務以及發送廣播等,不同的是,Intent 更傾向于立即執行某動作,而 PendingIntent 傾向于在某個時機去執行某動作。換言之,PendingIntent 是延遲執行的 Intent。

PendingIntent 主要用到三個靜態方法以獲取實例,分別是 getActivity()getBroadcast()getService(),他們都有四個參數:

  1. Context
  2. int requestCode:請求代碼,通常傳入 0
  3. Intent 對象
  4. int flags:確定 PendingIntent 的行為,通常情況下傳入 0,但也有四種具體值可選:FLAG_ONT_SHOTFLAG_CANCEL_CURRENTFLAG_NO_CREATEFLAG_UPDATE_CURRENT

PendingIntent對象 是通過 NotificationCompat.Builder.setContentIntent() 方法來在用戶點擊通知時執行意圖的。

如何實現點擊通知后,通知消失?

點擊該通知后這條通知并不會消失,解決的方法有兩種:

  1. NotificationCompat.Builder 中連綴一個 setAutoCancel() 方法,并傳入參數 true
    在這里插入圖片描述

  2. 顯式地在點擊通知后調轉到的頁面的 onCreate 階段,通過 NotificationManager.cacel() 將他取消:
    在這里插入圖片描述


其它小功能

NotificationCompat.Builder 提供了非常豐富的 API 供我們創建多樣的通知效果,這里舉例幾個常用的:

setSound():設置通知鈴聲,在 Android 8.0(O) 版本后需要在通知管道中添加 AudioAttributes 音頻屬性,關于 AudioAttributes 詳情見本博客。

在這里插入圖片描述


setVibrate():設置手機震動,參數為長整型數組,以毫秒為單位,偶數下標代表手機靜止時長,奇數下標代表手機震動時長。別忘了聲明手機震動權限:

在這里插入圖片描述

// 8.0 版本后需要在通知通道中設置允許震動
notificationChannel.enableVibration(true);
// 通知到來時立刻震動1秒,然后靜止1秒,再震動1秒。
.setVibrate(new long[] {0, 1000, 1000, 1000})

setLights():設置呼吸燈,參數分別指定顏色亮起時長熄滅時長。時長都以毫秒為單位。

// 8.0 版本后需要在通知通道中設置允許啟用呼吸燈
notificationChannel.enableLights(true);
.setLights(Color.CYAN, 1000, 1000)

setStyle():構建富文本內容,如長文件、圖片等:

  1. 長文字: 如果在 setContentText() 中設置的文本較長,那么多余的部分會被省略號替代。

在這里插入圖片描述
而通過 setStyle() 我們可以在下滑的通知欄中顯示完整內容(通知彈窗中的多余內容仍會被省略號替代):

.setStyle(new NotificationCompat.BigTextStyle().bigText("聯系人cmy向您發來一條消息哈哈哈哈哈哈哈哈哈哈哈哈哈哈"))

在這里插入圖片描述

  1. 圖片: 也可以在通知內容中加入圖片:
// 圖片,通過BitmapFactory.decodeResource()將圖片解析成Bitmap對象
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.cmy1)))

在這里插入圖片描述


setPriority():設置通知的重要程度

共有五個常量值可選:

  1. PRIORITY_DEFAULT: 默認,不特意設置時就是此值。
  2. PRIORITY_MIN: 最低的重要程度,系統只會在用戶下拉狀態欄等特定情況才會顯示該通知。
  3. PRIORITY_LOW:較低的重要程度,系統會將該類通知縮小,顯示順序在 PRIORITY_HIGH 之后。
  4. PRIORITY_HIGH:較高的重要程度,系統會將這類通知放大,顯示順序在 PRIORITY_MAX 之后。
  5. PRIORITY_MAX:最高的重要程度,系統會讓用戶立刻看到該通知,甚至需要用戶做出響應操作。

在 Android 8.0 版本后,通知的重要程度作為通知管道 NotificationChannel 構造函數的第三個參數存在,有以下值可選:

  1. NotificationManager.lMPORTANCE_UNSPECIFIED,
  2. NotificationManager.IMPORTANCE_NONE
  3. NotificationManager.IMPORTANCE_MIN
  4. NotificationManager.IMPORTANCE_LOW
  5. NotificationManager.IMPORTANCE_DEFAULT
  6. NotificationManager.IMPORTANCE_HIGH

在這里插入圖片描述

PS: 如若上述設置未生效,則應卸載軟件重新安裝后重試,這是因為所有配置都是在第一次創建通道時生效的


實例

實現通過點擊按鈕發出通知:

布局文件 notice_layout.xml
在這里插入圖片描述

活動文件:

public class NotificationActivity extends AppCompatActivity implements View.OnClickListener{private static final String TAG = "NotificationActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.notice_layout);Button button_send = findViewById(R.id.button_sendNotice);button_send.setOnClickListener(this);}public void onClick(View v){switch (v.getId()){case R.id.button_sendNotice:// 通知音頻的UriUri soundUri = Uri.parse("android.resource://"+getPackageName()+ "/"+R.raw.madara);Log.e(TAG, soundUri.toString());// 通知的idString id = "1";// 點擊通知后的跳轉意圖Intent intent = new Intent(this, DialogActivity.class);PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);/* 通知的創建流程 */// 第一步,管理通知的ManagerNotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);// 8.0(O)版本后需要通知通道(Notification channel)if(Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){String name = getString(R.string.app_name);// 創建通知通道// 第一個參數要和NotificationCompat.Builder的channelId一樣// 第三個參數是通知的重要程度NotificationChannel notificationChannel = new NotificationChannel(id, name,NotificationManager.IMPORTANCE_HIGH);// 如果上面用IMPORTANCE_NONE就需要在系統的設置里面開啟渠道,通知才能正常彈出/* 通知管道中開啟聲音、呼吸燈、震動等功能 */// 呼吸燈//notificationChannel.setLightColor(Color.CYAN);notificationChannel.enableLights(true);// 聲音// 先創建音頻屬性AudioAttributes audioAttributes = new AudioAttributes.Builder()// 描述音頻的內容類型,語音(speech)、音樂(music)、提示音(sonification)等.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)// 使用場景,USAGE_NOTIFICATION表明用于通知.setUsage(AudioAttributes.USAGE_NOTIFICATION).build();// 通知管道加入音頻notificationChannel.setSound(soundUri, audioAttributes);// 震動notificationChannel.enableVibration(true);// 設置是否應在鎖定屏幕上顯示此頻道的通知notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);// 繞過免打擾模式notificationChannel.setBypassDnd(true);// 將通知通道加入管理通知的NotificationManagermanager.createNotificationChannel(notificationChannel);}// 第二步,使用builder構造器來創建Notification對象// 通過support庫提供的NotificationCompat來兼容不同版本Notification notification = new NotificationCompat.Builder(this, id).setContentTitle("消息通知").setContentText("聯系人cmy向您發來一條消息")// 長文本/*.setStyle(new NotificationCompat.BigTextStyle().bigText("聯系人cmy向您發來" +"一條消息哈哈哈哈哈哈哈哈哈哈哈哈哈哈"))*/// 圖片,通過BitmapFactory.decodeResource()將圖片解析成Bitmap對象.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.cmy1)))// 指定通知被創建的時間,該時間會顯示在通知上。.setWhen(System.currentTimeMillis())// 通知的小圖標,顯示在系統狀態欄上只能用純alpha圖層的圖片設置.setSmallIcon(R.mipmap.ic_launcher)// 大圖標,下拉系統狀態欄時可見.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.cmy1))// 點擊通知后執行的意圖.setContentIntent(pi)// 點擊通知后通知消失// .setAutoCancel(true)// 通知鈴聲//.setSound(soundUri)// 手機震動,通知到來時立刻震動1秒,然后靜止1秒,再震動1秒.setVibrate(new long[] {0, 1000, 1000, 1000})// 呼吸燈,參數分別指定顏色、亮起時長、熄滅時長,時長都以毫秒為單位.setLights(Color.CYAN, 1000, 1000)// 根據當前手機環境來決定通知鈴聲、如何震動//.setDefaults(NotificationCompat.DEFAULT_ALL)// 構造通知.build();// 第三步,顯示通知;每個通知的id都不同,第二個參數是Notification對象manager.notify(2, notification);break;default:break;}}
}

運行結果:
在這里插入圖片描述
在這里插入圖片描述

點擊通知后跳轉:
在這里插入圖片描述


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

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

相關文章

Android開發(3) | 權限和內容提供器的應用——調用相機和相冊

文章目錄拍照并保存到 ImageView 控件布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作隱式 Intent 啟動后的回調AndroidManifest.xml從相冊選取照片并在 ImageView 控件中顯示布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作自定義打開相冊的方法 op…

Android開發(4) | 系統權限、MediaPlayer類 和 VideoView類 的應用——播放多媒體文件

文章目錄MediaPlayer類播放音頻的實例VideoView類播放視頻的實例MediaPlayer類 對多種格式的音頻文件提供了全面的控制方法: 如何獲得MediaPlayer實例? 通過構造函數: MediaPlayer mp new MediaPlayer();調用 MediaPlayer.create() 方法&…

Android入門(15)| 網絡

文章目錄WebViewHTTP使用HttpURLConnection使用OkHttp封裝網絡操作封裝HttpURLConnection封裝OkHttpWebView WebView 可以在 應用程序中&#xff08;而不是瀏覽器&#xff09; 展示一些網頁。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Java-單例模式

單例模式相信大家都不陌生&#xff0c;在JAVAEE應用中&#xff0c;單例模式是一種應用非常廣泛的設計模式&#xff0c;應用中許多組件都只需要單個實例&#xff0c;下面介紹單例模式。 使用單例模式的優點&#xff1a; 1.減少創建JAVA實例所帶來的系統開銷。 2.便于系統跟蹤單…

Android入門(16)| 服務

文章目錄概念Android 多線程繼承 Thread繼承 Runable 接口匿名類異步消息處理AsyncTask使用服務框架啟動/停止服務綁定/解綁服務服務的生命周期前臺服務IntentService完整版下載示例下載過程的回調接口&#xff1a;DownloadListener繼承 AsyncTask 實現下載功能&#xff1a;Dow…

2020德勤面試開始了嗎_2020國考面試開始,近期面試公告匯總,附結構化小組面試流程...

2020年國家公務員考試面試環節逐步恢復考試&#xff0c;各個招錄部門已經發布面試考察公告&#xff0c;對于進入面試環節的國考考生來說&#xff0c;有必要了解近期國考面試的招錄動態&#xff0c;提前做好面試準備。2020國考國家統計局機關面試面試確認&#xff1a;請進入面試…

項目積壓需求項目計劃_需求變更頻繁,項目經理如何做好需求管理?

項目實施過程中&#xff0c;項目經理常常面臨一個重大挑戰——需求變更。需求變更無處不在&#xff0c;市場條件變化、新業務出現、戰略目標調整、客戶需求修改、資源限制等&#xff0c;都會造成需求變更。需求變更會影響項目的時間、成本和質量&#xff0c;對整個項目和團隊成…

Android | Sensor.TYPE_ORIENTATION被廢棄后的解決辦法

文章目錄概述getOrientation 方法根據 旋轉矩陣R 獲取 設備旋轉弧度getRotationMatrix 方法根據 地磁場、加速度傳感器對象 獲取 旋轉矩陣R代碼參考資料概述 Sensor.TYPE_ORIENTATION 常數在 API 8 中已棄用&#xff0c;官方推薦使用 SensorManager.getOrientation() 替代。關…

【JAVA 開發小問題】 | String操作合集

文章目錄截取特定兩個字符之間的字符串截取特定兩個字符之間的字符串 利用正則表達式&#xff0c;圖片來源

uniapp 刷新后數據都沒有了_環境溫度傳感器都沒有連接,竟然還會有數據?

福田歐曼GTL(福康發動機、康明斯2880系統)匹配ECoffit尿素泵●故障現象&#xff1a;OBD故障燈點亮&#xff0c;不燒尿素&#xff0c;油耗高&#xff0c;動力不足●故障碼&#xff1a;●維修分析&#xff1a;①故障指出加熱器問題&#xff0c;摸下尿素箱溫度&#xff0c;發現燙手…

Android | 再探 RecyclerView 之名詞解析

文章目錄Adapter、ViewHolderchild viewLayoutManagerRecyclerScrapDirtyIndexPositionlayout position 和 adapter position四級緩存瀏覽本文前推薦先閱讀 Android入門&#xff08;九&#xff09;| 滾動控件 ListView 與 RecyclerView Adapter、ViewHolder Adapter: A subcla…

Linux學習:第一章-Linux簡介

一 UNIX發展史1 1965年&#xff0c;美國麻省理工學院&#xff08;MIT&#xff09;、通用電氣公司&#xff08;GE&#xff09;及AT&T的貝爾實驗室聯合開發Multics工程計劃&#xff0c;其目標是開發一種交互式的具有多道程序處理能力的分時操作系統&#xff0c;但因Multics追…

尼爾機器人技能快捷鍵_《尼爾機械紀元》連招操作技巧

《尼爾機械紀元》中的每個角色都可以裝備一個輕武器和一個重武器&#xff0c;技能招式也很豐富&#xff0c;下面為大家帶來了《尼爾機械紀元》連招操作技巧&#xff0c;希望對你們有所幫助。連擊技能展示視頻視頻原址&#xff1a;點擊進入基本沒有什么太難的連段&#xff0c;只…

保姆級教學!Xcode 配置 OpenGL 環境

文章目錄GLFW獲取 GLFWGLAD獲取 GLAD在 Xcode 中配置下載好的 GLFW 和 GLAD配置流程檢測是否配置成功無關配置的題外話——Xcode 下安全的刪除移動操作GLFW Graphics Library Framework&#xff08;圖形庫框架&#xff09;&#xff0c;可以讓我們通過其封裝好的 通用API 來正確…

Android入門(17)| 百度提供的 Android定位SDK

文章目錄配置百度提供的 Android定位SDK用于發布的 SHA1用于測試的 SHA1使用百度定位實例配置百度提供的 Android定位SDK 詳情參見官方文檔&#xff0c;這里僅對獲取 SHA1 做詳細介紹&#xff1a; 用于發布的 SHA1 用于測試的 SHA1 使用百度定位實例 public class LocationAc…

ios 不被遮擋 陰影_為何你沒見到日環食?你不知道的天象常識原來還有這么多 | 返樸...

關注風云之聲提升思維層次導讀說好的日環食呢&#xff0c;為什么上周很多人只等到了日偏食?日食月食的時間和種類是怎么預測的?你真的弄懂了各種日食和月食的成因嗎&#xff1f;你了解它們有什么區別和聯系&#xff0c;又遵循什么樣的時間規律嗎? 日食和月食發生的頻率一樣嗎…

初識貝塞爾(bezier)曲線

文章目錄資料援引貝塞爾曲線的用途一階貝塞爾&#xff08;bezier&#xff09;曲線二階貝塞爾&#xff08;bezier&#xff09;曲線三階貝塞爾&#xff08;bezier&#xff09;曲線高階貝塞爾&#xff08;bezier&#xff09;曲線三階貝塞爾曲線求插值&#xff08;Slerp&#xff09…

python代碼測試 vim_用 Hypothesis 快速測試你的 Python 代碼

點擊上方“Python編程時光”&#xff0c;選擇“加為星標”第一時間關注Python技術干貨&#xff01;介紹無論你使用哪種編程語言或框架&#xff0c;測試都非常重要。Hypothesis是 Python 的一個高級測試庫。它允許編寫測試用例時參數化&#xff0c;然后生成使測試失敗的簡單易懂…

Mac 下 CMake 的配置與使用

文章目錄安裝與配置編譯單個源文件編譯前的準備開始編譯編譯多個源文件多個源文件在同一目錄下多個源文件在不同目錄下math 目錄下的 CMakeLists.txt根目錄的 CMakeLists.txtoption 選項導入外部庫本地導入&#xff08;find_package&#xff09;外部導入&#xff08;FetchConte…

五軸編程_沙井萬豐數控數控編程五軸編程那個軟件好用

沙井萬豐數控數控編程五軸編程那個軟件好用設計需要掌握很高很全面的知識和技能&#xff0c;模具做的好&#xff0c;產品質量好&#xff0c;模具結構合理&#xff0c;生產效率高&#xff0c;工廠效益好。正因如此&#xff0c;模具技術工在外打工的工資都非常的高。少則每月幾千…