Android呼叫訊息欄通知(Notification)
用過安卓的應該對通知欄訊息都很熟悉了,下面是演示通知欄訊息的一個Demo,首先來看一下介面,後面是程式碼,解釋就都放在程式碼裡了.
java程式碼
package jason.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.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
Button button;int id = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.notify);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//獲得通知管理器
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
//構建一個通知物件(需要傳遞的引數有三個,分別是圖示,標題和 時間)
Notification notification = new Notification(R.drawable.ic_launcher,"通知",System.currentTimeMillis());
Intent intent = new Intent(MainActivity.this,MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0); notification.setLatestEventInfo(getApplicationContext(), "通知標題", "通知顯示的內容", pendingIntent);
notification.flags = Notification.FLAG_AUTO_CANCEL;//點選後自動消失
notification.defaults = Notification.DEFAULT_SOUND;//聲音預設
manager.notify(id, notification);//發動通知,id由自己指定,每一個Notification對應的唯一標誌
//其實這裡的id沒有必要設定,只是為了下面要用到它才進行了設定
}
});
}
}
對於通知的結構下面有個圖很好的進行了標註
以下是每個部分的說明:
1. 內容標題
2. 大型icon
3. 內容text
4. 內容info
5. 小型icon
6. 釋出通知的時間。你能使用setWhen()設定一個明確的值。
下面再具體的記錄一下其他細節
我們可以為Notification指定它的圖示,標題,時間,提醒方式,點選之後的動作。還能做什麼呢
1、由於每個Notification的ID是唯一的,所以我們可以刪除某些通知:
manager.cancel(id, notification);
2、同理,通過重複傳送相同ID的Notification,我們還可以更新某些通知:
manager.notify(id, new_notification);
3、由於Notification的包裝內容為Intent,我們就可以方便地為通知被點選的觸發的事件傳值:現在回到下面的位置來
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,new Intent(MainActivity.this,MainActivity.class),0);
注意最後一個“0”,0表示什麼?表示什麼都不做,下次你傳進來的Intent,如果被發現是同一個Intent,則所有通知都保持為同一個Intent,只是新來的Extra被保留了。我們應該期望每個Notification都能幹點不一樣的事情,按上面的方式這樣來,每個具備相同Intent的Notification相互之間,其實是毫無區別的。好,我們來看下除了0以外Android還有什麼設定: 1、PendingIntent.FLAG_UPDATE_CURRENT如果該PendingIntent已經存在,則用新傳入的Intent的Extra更新當前的資料。2、PendingIntent.FLAG_ONE_SHOTsend()只能被執行一次,即是說,假如該通知點選後不消失,那麼再次點選不會發生任何事。3、PendingIntent.FLAG_NO_CREATE如果該PendingIntent不存在,直接返回null而不是建立一個PendingIntent.4、PendingIntent.FLAG_CANCEL_CURRENT如果該PendingIntent已經存在,則在生成新的之前取消當前的。 嗯,明顯都不是我們想要的。 其實答案根本不在PendingIntent包裝上。PendingIntent所做的全部事情都只是對同樣的Intent進行處理,關鍵詞,在於“同樣的”既然每次你開啟的都是同一個Intent,那區分PendingIntent就沒有意義了所以,在Intent定義的時候,你還需要區分Intent推薦方式:intent.setData(Uri.parse("custom://"+System.currentTimeMillis()));
這樣就實現了Intent的區別化,以後每次傳入的Intent都會具備不同的Extra,當然,PendingIntent需要定義為PendingIntent.FLAG_UPDATE_CURRENT 到這個地方,其實還剩下一個問題,很快你就會發現每次點選通知,都正確的彈出你要的Activity,但是之前的開啟的Activity依舊存在方法有二:1、在Activity的onPause()方法體中增加:finish();這樣,在開啟新的Activity的時候,舊的就進入了暫停態,啟動onPause(),然後執行finish(),活動結束
好吧,這是個蠢辦法,請不要使用2、設定Intent:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);是的,這句就夠了,這裡我得說一下Activity的棧機制:我們先來看看Intent的結構new Intent(MainActivity.this,MainActivity.class);第一個引數為產生該意圖(Intent)的活動,這個邏輯再清晰不過了,要做的事情得有個發出的主體第二個引數為該意圖的物件,即是這個意圖是什麼,我們來看看。呃!??這裡沒有物件……是的,我們只有了一個物件的類名,但遠遠不是某個具體的物件,這是反射麼?反射能通過一個類名來找到某個特定的類例項麼? 事實如下:Android有一個棧機制,每個產生的活動在過了產生期後,都會進入這個棧,新的活動壓著舊的活動,每一次尋找類名的時候,都預設提取的是棧頂的活動。這也是為什麼Android能快捷的執行返回操作。回到原點來,我們為Intent新增:openintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);之後,這個意圖一旦產生,就會自動清除棧頂的活動,即是說,上一個被開啟的活動會被終結掉,於是就實現了沒有兩個相同的活動被同時開啟。
原文:http://www.apkbus.com/android-4875-1.html
相關文章
- 訊息通知(Notification)系統最佳化
- Android 8 通知渠道(Notification Channels)Android
- [轉]Android 通知Notification 詳解Android
- 什麼是push通知欄訊息?
- 訊息通知(Notification)/使用者觸達系統設計
- 呼叫推送介面返回成功,手機端未收到通知欄訊息,該如何自檢?
- Android常駐通知欄Android
- Laravel——訊息通知Laravel
- Laravel 訊息通知Laravel
- 【Android】狀態列通知Notification、NotificationManager詳解(轉載)Android
- Flutter 通知(Notification)冒泡原理Flutter
- Notification桌面通知實踐
- Android 《Notification》Android
- 短視訊帶貨原始碼,android 自定義常駐通知欄原始碼Android
- 訊息通知系統記錄
- 鴻蒙傳送訊息通知鴻蒙
- redis學習(七) 訊息通知Redis
- 直播平臺原始碼,各個樣式的訊息通知欄顯示方式原始碼
- Android 通知欄顯示自定義通知時設定更高的高度Android
- Flutter學習筆記(35)--通知NotificationFlutter筆記
- Android中的NotificationAndroid
- 訊息通知 使用 [ Web-msg-sender]Web
- js炫酷訊息通知外掛JS
- CommunityToolkit.Mvvm8.1 訊息通知(4)UnityMVVM
- 使用 laravel-wechat-notification 傳送微信模板訊息、企業微信應用訊息Laravel
- 瀏覽器語音桌面通知,Notification API瀏覽器API
- H5 notification瀏覽器桌面通知H5瀏覽器
- Android O 新特性 — NotificationAndroid
- Android之Notification和RemoteviewAndroidREMView
- C# 使用SignalR實現訊息通知C#SignalR
- 聊聊HTML5中的Web Notification桌面通知HTMLWeb
- Laravel 訊息通知原始碼閱讀筆記Laravel原始碼筆記
- X-Admin&ABP框架開發-訊息通知框架
- Python呼叫飛書傳送訊息Python
- 理解 Android 訊息機制Android
- Android之訊息推送原理Android
- Android訊息機制HandlerAndroid
- android訊息機制—HandlerAndroid
- Android訊息框架速記Android框架