【Android】狀態列通知Notification、NotificationManager詳解
在訊息通知時,我們經常用到兩個元件Toast和Notification。特別是重要的和需要長時間顯示的資訊,用Notification就最合適不過了。當有訊息通知時,狀態列會顯示通知的圖示和文字,通過下拉狀態列,就可以看到通知資訊了,Android這一創新性的UI元件贏得了使用者的一致好評,就連蘋果也開始模仿了。今天我們就結合例項,探討一下Notification具體的使用方法。
首先說明一下我們需要實現的功能是:在程式啟動時,發出一個通知,這個通知在軟體執行過程中一直存在,相當於qq的托盤一樣;然後再演示一下普通的通知和自定義檢視通知。
那我們就先建立一個名為notification的專案,然後編輯/res/layout/main.xml檔案,程式碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:text="點選按鈕進入演示介面"/>
- <Button
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="notify activity"
- android:onClick="notify"/>
- </LinearLayout>
然後編輯MainActivity.java檔案,程式碼如下:
- package com.scott.notification;
- import android.app.Activity;
- import android.app.Notification;
- import android.app.NotificationManager;
- import android.app.PendingIntent;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- public class MainActivity extends Activity {
- private static final int ONGOING_ID = 0;
- private NotificationManager mNotificationManager;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setUpNotification();
- }
- private void setUpNotification() {
- Context context = this;
- mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- int icon = R.drawable.ongoing;
- CharSequence tickerText = "程式已啟動";
- long when = System.currentTimeMillis();
- //新建一個Notification例項
- Notification notification = new Notification(icon, tickerText, when);
- // 把通知放置在"正在執行"欄目中
- notification.flags |= Notification.FLAG_ONGOING_EVENT;
- CharSequence contentTitle = "Notification示例";
- CharSequence contentText = "程式正在執行中,點選此處跳到演示介面";
- Intent intent = new Intent(context, NotifyActivity.class);
- PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);
- notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
- mNotificationManager.notify(ONGOING_ID, notification);
- }
- public void notify(View view) {
- Intent intent = new Intent(this, NotifyActivity.class);
- startActivity(intent);
- }
- @Override
- public void onBackPressed() {
- super.onBackPressed();
- finish();
- //取消一個通知
- mNotificationManager.cancel(ONGOING_ID);
- //結束程式
- android.os.Process.killProcess(android.os.Process.myPid());
- System.exit(0);
- }
- }
大家看以看到,在程式主介面啟動時會發出一個通知,並且將這個通知放置在“正在執行”欄目中,這樣在軟體執行過程中它就會始終存在;另外,在上面的程式碼中,在使用者按下回退按鈕時,我們使用NotificationManager.cancel(int id)方法取消這個通知。
先來看一下執行效果如何:
點選主介面的按鈕和Ongoing欄目中的通知均能跳轉到NotifyActivity介面,在這個介面中,我們主要演示一下普通通知和自定義檢視通知的使用。
我們先要在/res/layout/目錄下新增一個notify.xml佈局檔案,程式碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <Button
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="normal notify"
- android:onClick="normalNotify"/>
- <Button
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="custom notify"
- android:onClick="customNotify"/>
- </LinearLayout>
因為要演示自定義通知檢視,我們需要定義一個自定義通知檢視的佈局檔案,擺放我們自己的佈局元件,因此在/res/layout/目錄下新增一個custom_notification_layout.xml檔案,程式碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:padding="3dp">
- <ImageView
- android:id="@+id/imageView"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:layout_marginRight="10dp"/>
- <TextView
- android:id="@+id/textView"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:textColor="#000"/>
- </LinearLayout>
然後就來看一下NotifyActivity.java的程式碼:
- package com.scott.notification;
- import android.app.Activity;
- import android.app.Notification;
- import android.app.NotificationManager;
- import android.app.PendingIntent;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.RemoteViews;
- public class NotifyActivity extends Activity {
- //注意,如果不想覆蓋前一個通知,需設定不同的ID
- private static final int NORMAL_NOTIFY_ID = 1;
- private static final int CUSTOM_NOTIFY_ID = 2;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.notify);
- }
- // 普通通知事件
- public void normalNotify(View view) {
- Context context = this;
- NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- int icon = android.R.drawable.stat_notify_voicemail;
- CharSequence tickerText = "普通通知";
- long when = System.currentTimeMillis();
- Notification notification = new Notification(icon, tickerText, when);
- // 設定聲音
- notification.defaults |= Notification.DEFAULT_SOUND;
- //設定震動(需加VIBRATE許可權)
- notification.defaults |= Notification.DEFAULT_VIBRATE;
- // 設定LED燈提醒
- notification.defaults |= Notification.DEFAULT_LIGHTS;
- // 設定點選此通知後自動清除
- notification.flags |= Notification.FLAG_AUTO_CANCEL;
- CharSequence contentTitle = "普通通知的標題";
- CharSequence contentText = "通知的內容部分,一段長長的文字...";
- Intent intent = new Intent(context, TargetActivity.class);
- PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);
- notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
- mNotificationManager.notify(NORMAL_NOTIFY_ID, notification);
- }
- // 個性化通知點選事件
- public void customNotify(View view) {
- Context context = this;
- NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- int icon = android.R.drawable.stat_notify_voicemail;
- CharSequence tickerText = "自定義通知";
- long when = System.currentTimeMillis();
- Notification notification = new Notification(icon, tickerText, when);
- notification.flags |= Notification.FLAG_AUTO_CANCEL;
- RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
- contentView.setImageViewResource(R.id.imageView, R.drawable.smile);
- contentView.setTextViewText(R.id.textView, "這是一個個性化的通知檢視,代替了系統預設的通知檢視.");
- // 指定個性化檢視
- notification.contentView = contentView;
- Intent intent = new Intent(context, TargetActivity.class);
- PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);
- // 指定內容意圖
- notification.contentIntent = contentIntent;
- mNotificationManager.notify(CUSTOM_NOTIFY_ID, notification);
- }
- }
注意,上邊在新增一個普通通知時使用到了震動,所以需要在AndroidManifest.xml中加入相關許可權:
- <uses-permission android:name="android.permission.VIBRATE"/>
除了使用程式碼中的預設通知屬性之外,使用者也可以自定義屬性值:
1.自定義聲音:
- notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
2.自定義震動方式:
- long[] vibrate = {0, 100, 200, 300};
- notification.vibrate = vibrate;
這個陣列定義了交替的震動和關閉,以毫秒為單位。第一個值是等待多久開始震動,第二個值是第一次震動的時間,第三個值是停止震動的時間,以此類推。定義多長時間都行,但是不能設定為重複。
3.自定義閃光方式:
- notification.ledARGB = 0xff00ff00;
- notification.ledOnMS = 300;
- notification.ledOffMS = 1000;
- notification.flags |= Notification.FLAG_SHOW_LIGHTS;
上邊幾行程式碼表示綠燈先顯示300毫秒然後關閉一秒鐘。如果裝置不支援指定的顏色,則會按照最接近的顏色顯示。
如果全部都使用預設值時,可以用以下程式碼代替程式中的幾行設定defaults的程式碼:
- notification.defaults |= Notification.DEFAULT_ALL;
注意,在自定義以上屬性時,如果defaults中與之相關的預設值已設定,則自定義屬性就會失效。
然後再來介紹一下幾種常用的flags:
1.FLAG_AUTO_CANCEL:在使用者檢視通知資訊後自動關閉通知;
2.FLAG_INSISTENT:在使用者響應之前一直重複;
3.FLAG_ONGOING_EVENT:放置在“正在執行”欄目中,表示程式正在執行,可見狀態,或是後臺執行;
4.FLAG_NO_CLEAR:檢視通知後不會自動取消,對一直進行中的通知非常有用。
在上面的程式中,點選通知後跳轉到TargetActivity介面,這個介面非常簡單,就顯示一串文字,這裡就不必多說了。
最後讓我們演示一下效果:
關於notification的相關知識,今天先介紹到這裡,以後會繼續介紹更深入的使用技巧。
相關文章
- 【Android】狀態列通知Notification、NotificationManager詳解(轉載)Android
- [轉]Android 通知Notification 詳解Android
- Android 8 通知渠道(Notification Channels)Android
- Android 狀態列透明Android
- Android獲取狀態列高度Android
- Android全屏與透明狀態列Android
- react-native android狀態列ReactAndroid
- Android 隱藏系統狀態列Android
- 埠狀態詳解
- Notification桌面通知實踐
- Flutter 通知(Notification)冒泡原理Flutter
- 樹狀陣列詳解陣列
- Android 沉浸式狀態列的實現Android
- android判斷狀態列是否可見Android
- HTTP狀態碼詳解HTTP
- Android 《Notification》Android
- oreo上的notification詳解
- Android-沉浸式狀態列的實現Android
- React Native Modal元件 Android覆蓋狀態列React Native元件Android
- Ceph MDS States狀態詳解
- 狀態列
- Android 商品詳情頁懸浮效果以及沉浸式狀態列,無衝突Android
- 『言善信』Fiddler工具 — 6、Fiddler介面佈局詳解【命令列和狀態列】命令列
- 關於 Android 狀態列的適配總結Android
- Vue狀態管理庫Pinia詳解Vue
- vuex管理狀態倉庫詳解Vue
- MySQL執行緒狀態詳解MySql執行緒
- Flutter學習筆記(35)--通知NotificationFlutter筆記
- Android 顯示、隱藏狀態列和導航欄Android
- Android中的NotificationAndroid
- java執行緒的五大狀態,阻塞狀態詳解Java執行緒
- 前端開發:HTTP狀態碼詳解前端HTTP
- Android 沉浸式狀態列 漸變顏色的實現Android
- 狀態列相關
- 沉浸式狀態列
- 訊息通知(Notification)系統最佳化
- 瀏覽器語音桌面通知,Notification API瀏覽器API
- H5 notification瀏覽器桌面通知H5瀏覽器
- Android O 新特性 — NotificationAndroid