Notification:
顯示在手機(jī)狀態(tài)欄的通知。Notification所代表的是一種具有全局效果的通知,程序一般通過NotificationManager服務(wù)來發(fā)送Notification。
Android3.0增加了Notification.Builder類,該類可以輕松地創(chuàng)建Notification對象。
Notification,俗稱通知,是一種具有全局效果的通知,它展示在屏幕的頂端,首先會表現(xiàn)為一個圖標(biāo)的形式,當(dāng)用戶向下滑動的時候,展示出通知具體的內(nèi)容。
注意:
1,因為一些Android版本的兼容性問題,對于Notification而言,Android3.0是一個分水嶺,如果不考慮向下兼容的問題,構(gòu)建Notification使用Notification.Builder構(gòu)建,如果考慮到向下兼容性的問題,一般推薦使用NotificationCompat.Builder構(gòu)建(NotificationCompat類在v4:android.support.v4.app.NotificationCompat)。
2,在實際使用過程中,一般不會直接構(gòu)建Notification對象,而是使用它的一個內(nèi)部類NotificationCompat.Builder來實例化一個對象(Android3.0之下使用Notification.Builder),并設(shè)置通知的各種屬性,最后通過NotificationCompat.Builder.build()方法得到一個Notification對象。當(dāng)獲得這個對象之后,可以使用NotificationManager.notify()方法發(fā)送通知,可通過Activity.getSystemService(String)方法獲取NotificationManager對象,Activity.getSystemService(String)方法可以通過Android系統(tǒng)級服務(wù)的句柄,返回對應(yīng)的對象。在這里需要返回NotificationManager,所以直接傳遞Context.NOTIFICATION_SERVICE。
——————————————————————————————————————————
(二)、Notification.Builder類中提供的方法:
builder.setAutoCancel(); 設(shè)置點擊通知后,狀態(tài)欄自動刪除通知。
builder.setSmallIcon(R.drawable.alert); 設(shè)置通知小圖標(biāo) 必須設(shè)置
builder.setLargeIcon(R.drawable.alert2); 設(shè)置通知大圖標(biāo)
builder.setContentTitle("標(biāo)題"); 設(shè)置通知標(biāo)題 必須設(shè)置
builder.setContentText("文本"); 設(shè)置通知內(nèi)容 必須設(shè)置
builder.setDefaults(Notification.DEFAULT_ALL);
設(shè)置默認(rèn)的通知音樂、振動、LED等。
builder.setSound(uri); 設(shè)置通知的音樂
builder.setTicker(); 設(shè)置通知在狀態(tài)欄的提示文本。第一次提示消息的時候顯示在通知欄上。
builder.setContentIntent(); 設(shè)置點擊通知后將要啟動的程序組件對應(yīng)的PendingIntent。
進(jìn)階方法:
builder.setVibrate(new long[ ]); 按long數(shù)組4個參數(shù)設(shè)置手機(jī)震動頻次,請求權(quán)限
builder.setLights(int(color類顏色字段),int,int);設(shè)置LED燈閃爍顏色和間隔
builder.setStyle(new NotificationCompat對象);
new NotificationCompat的方法除了獲取Notification對象,也可可以允許我們設(shè)置通知的長文本和大圖片格式
大圖片方法:BigPictureStyle().bigPicture( Bitmap對象);
Bitmap對象需要通過圖片解碼類BitmapFactory.decodeResource(getResources(),圖片對象);獲取
長文本方法:BigTextStyle().bigText(String對象);
builder.setPriority(PRORITY_MAX/PRORITY_HIGH/PRORITY_LOW/PRORITY_MIN);設(shè)置通知優(yōu)先級
設(shè)置點擊通知后的取消方法:
1.使用builder.setAutoCancel(); 設(shè)置點擊通知后,狀態(tài)欄自動刪除通知
2.在通知啟動的活動中調(diào)用manager.cancel(id)取消,id為notify(id,Notification對象)時注冊的id
——————————————————————————————————————————
Broadcast:
廣播接收器,也被稱為全局事件,或系統(tǒng)事件。
當(dāng)Android系統(tǒng)中任何程序有動作時,如果想通知其他程序,采用廣播的方式進(jìn)行傳播是非常有效的。廣播從理論上說,可以將一個動作傳播給任意多個程序(當(dāng)然,廣播接收器的數(shù)量會收到系統(tǒng)限制)。
系統(tǒng)完成一定的動作,就會自動發(fā)出廣播,它只負(fù)責(zé)“說”而不管你“聽不聽”,也就是不管你接收方如何處理。
廣播的類型:
1).Normal Broadcast:普通廣播
此處將普通廣播界定為:開發(fā)者自己定義的intent,以context.sendBroadcast_"AsUser"(intent, ...)形式。具體可以使用的方法有:
sendBroadcast(intent)/sendBroadcast(intent, receiverPermission)/sendBroadcastAsUser(intent, userHandler)/sendBroadcastAsUser(intent, userHandler,receiverPermission)。
普通廣播會被注冊了的相應(yīng)的感興趣(intent-filter匹配)接收,且順序是無序的。如果發(fā)送廣播時有相應(yīng)的權(quán)限要求,BroadCastReceiver如果想要接收此廣播,也需要有相應(yīng)的權(quán)限。
2).System Broadcast: 系統(tǒng)廣播
Android系統(tǒng)中內(nèi)置了多個系統(tǒng)廣播,只要涉及到手機(jī)的基本操作,基本上都會發(fā)出相應(yīng)的系統(tǒng)廣播。如:開啟啟動,網(wǎng)絡(luò)狀態(tài)改變,拍照,屏幕關(guān)閉與開啟,點亮不足等等。每個系統(tǒng)廣播都具有特定的intent-filter,其中主要包括具體的action,系統(tǒng)廣播發(fā)出后,將被相應(yīng)的BroadcastReceiver接收。系統(tǒng)廣播在系統(tǒng)內(nèi)部當(dāng)特定事件發(fā)生時,有系統(tǒng)自動發(fā)出。
3).Local Broadcast:本地廣播
通過getInstance()方法獲得LocalBroadcastManager類的實例并進(jìn)行發(fā)送與注冊。
本地廣播無法通過靜態(tài)注冊接受。
性質(zhì):保密性,安全性,高效性。
4).Ordered broadcast:有序廣播
有序廣播的有序廣播中的“有序”是針對廣播接收者而言的,指的是發(fā)送出去的廣播被BroadcastReceiver按照先后循序接收。有序廣播的定義過程與普通廣播無異,只是其的主要發(fā)送方式變?yōu)椋簊endOrderedBroadcast(intent, receiverPermission, ...)。
對于有序廣播,其主要特點總結(jié)如下:
1>多個具當(dāng)前已經(jīng)注冊且有效的BroadcastReceiver接收有序廣播時,是按照先后順序接收的,先后順序判定標(biāo)準(zhǔn)遵循為:將當(dāng)前系統(tǒng)中所有有效的動態(tài)注冊和靜態(tài)注冊的BroadcastReceiver按照priority屬性值從大到小排序,對于具有相同的priority的動態(tài)廣播和靜態(tài)廣播,動態(tài)廣播會排在前面。
2>先接收的BroadcastReceiver可以對此有序廣播進(jìn)行截斷,使后面的BroadcastReceiver不再接收到此廣播,也可以對廣播進(jìn)行修改,使后面的BroadcastReceiver接收到廣播后解析得到錯誤的參數(shù)值。當(dāng)然,一般情況下,不建議對有序廣播進(jìn)行此類操作,尤其是針對系統(tǒng)中的有序廣播。
廣播的注冊:
1、靜態(tài)注冊:
靜態(tài)注冊方式是在AndroidManifest.xml的application里面定義receiver并用<intent-filter>標(biāo)簽設(shè)置過濾器,接收指定action廣播。。
如果在清單配置文件中配置了廣播接收器,那么程序在安裝后會自動注冊廣播接收器。
靜態(tài)注冊方式的特點:不管該應(yīng)用程序是否處于活動狀態(tài),都會進(jìn)行監(jiān)聽。
新創(chuàng)建接收器class文件繼承BroadcastReceiver的類,重寫onReceiver方法,并在onReceiver方法中對廣播進(jìn)行處理。
當(dāng)發(fā)生了AndroidManifest.xml中對應(yīng)事件,就調(diào)用當(dāng)前廣播的onReceiver方法。
2、動態(tài)注冊:
方式是在同一個activity里面新創(chuàng)建內(nèi)部class繼承BroadcastReceiver的類,并調(diào)用當(dāng)前上下文對象的registerReceiver() 方法來注冊,和靜態(tài)的內(nèi)容差不多。一個形參是receiver對象,另一個是IntentFilter對象。而IntentFilter構(gòu)造方法的參數(shù)是要接收的action。
動態(tài)注冊方式特點:在代碼中進(jìn)行注冊后,當(dāng)應(yīng)用程序關(guān)閉后,就不再進(jìn)行監(jiān)聽。
動態(tài)注冊廣播接收器的特點,就是當(dāng)用來注冊的 Activity 關(guān)掉后,廣播也就失效了。同時反映了靜態(tài)注冊的一個優(yōu)勢,就是無需擔(dān)憂廣播接收器是否被關(guān)閉,只要設(shè)備是開啟狀態(tài),廣播接收器就是打開著的。
//創(chuàng)建自己的接收器
MyReceiver receiver = new MyReceiver();
//創(chuàng)建過濾器,并指定action,使之用于接收同action的廣播
IntentFilter filter = new IntentFilter("android.intent.action.PHONE_STATE");
//或者:
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.PHONE_STATE");
filter.setPriority(999);
registerReceiver(receiver, filter);//接收器與通知事件注冊
發(fā)送及接受自定義廣播:
接收:
創(chuàng)建自己的接收器繼承BroadcastReceiver的類并動態(tài)or靜態(tài)注冊,在onReceiver方法中處理具體邏輯。
發(fā)送:
// 指定廣播目標(biāo)Action
Intent intent = new Intent("MyReceiver_Action");
//此字段與接收器注冊的字段匹配一致則調(diào)用其onReceiver方法
// 可通過Intent攜帶消息
intent.putExtra("msg", "發(fā)送廣播");
// 發(fā)送廣播消息
sendBroadcast(intent);
注銷BroadcastReceiver:
1、一般在onStart中注冊BroadcastReceiver,在onStop中取消BroadcastReceiver。
2、一個BroadcastReceiver 對象只有在被調(diào)用onReceive(Context, Intent)時才有效,當(dāng)從該方法返回后,該對象就無效的了,結(jié)束生命周期。
//動態(tài)注冊的廣播要記住在activity的onDestroy回調(diào)方法中注銷廣播接收器
unregisterReceiver(receiver);
——————————————————————————————————————————
【廣播系統(tǒng)大全及實例樣本】:http://blog.csdn.net/zhangzhen_v/article/details/51697330
【各種廣播詳解及版本變遷】:http://www.cnblogs.com/lwbqqyumidi/p/4168017.html