標籤:
pendingIntent字面意義:等待的,未決定的Intent。
pendingIntent對象,使用方法類的靜態方法 :
getActivity(Context, int, Intent, int)------->跳轉到一個activity組件、
getBroadcast(Context, int, Intent, int)------>開啟一個廣播組件
getService(Context, int, Intent, int)-------->開啟一個服務元件。
分別對應著Intent的3個行為和參數有4個,比較重要的事第三個和第一個,其次是第四個和第二個。可以看到,要得到這個對象,必須傳入一個Intent作為參數,必須有context作為參數。
pendingIntent是一種特殊的Intent。主要的區別在於Intent的執行立刻的,而pendingIntent的執行不是立刻的。pendingIntent執行的操作實質上是參數傳進來的Intent的操作,但是使用pendingIntent的目的在於它所包含的Intent的操作的執行是需要滿足某些條件的。
主要的使用的地方和例子:通知Notificatio的發送,短訊息SmsManager的發送和警報器AlarmManager的執行等等。
intent英文意思是意圖,pending表示即將發生或來臨的事情。
PendingIntent這個類用於處理即將發生的事情。比如在通知Notification中用於跳轉頁面,但不是馬上跳轉。
Intent 是及時啟動,intent 隨所在的activity 消失而消失。
PendingIntent 可以看作是對intent的封裝,通常通過getActivity,getBroadcast ,getService來得到pendingintent的執行個體,當前activity並不能馬上啟動它所包含的intent,而是在外部執行 pendingintent時,調用intent的。正由於pendingintent中 儲存有當前App的Context,使它賦予外部App一種能力,使得外部App可以如同當前App一樣的執行pendingintent裡的 Intent, 就算在執行時當前App已經不存在了,也能通過存在pendingintent裡的Context照樣執行Intent。另外還可以處理intent執行後的操作。常和alermanger 和notificationmanager一起使用。
Intent一般是用作Activity、Sercvice、BroadcastReceiver之間傳遞資料,而Pendingintent,一般用在 Notification上,可以理解為順延強制的intent,PendingIntent是對Intent一個封裝。
Android的狀態列通知(Notification)
如果需要查看訊息,可以拖動狀態列到螢幕下方即可查看訊息。
步驟:
1擷取通知管理器NotificationManager,它也是一個系統服務
2建立通知Notification notification = new Notification(icon, null, when);
3為新通知設定參數(比如聲音,震動,燈光閃爍)
4把新通知添加到通知管理器
發送訊息的代碼如下:
//擷取通知管理器
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)
int icon = android.R.drawable.stat_notify_chat;
long when = System.currentTimeMillis();//通知發生的時間為系統目前時間
Notification notification = new Notification(icon, null, when);//建立一個通知,第一個參數為表徵圖,第二個參數為短暫提示標題,第三個為通知時間
notification.defaults = Notification.DEFAULT_SOUND;//發出預設聲音
notification.flags |= Notification.FLAG_AUTO_CANCEL;//點擊通知後自動清除通知
Intent openintent = new Intent(this, OtherActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, openintent, 0);//當點擊訊息時就會向系統發送openintent意圖
notification.setLatestEventInfo(this, “標題”, “我是內容", contentIntent);//setLatestEventInfo表示設定點擊該通知的事件
mNotificationManager.notify(0, notification);//第一個參數為自訂的通知唯一標識
重點是setLatestEventInfo( )方法的最後一個參數!!!!它是一個PendingIntent!!!!!!!!!
這裡使用到了PendingIntent(pend本意是待定,不確定的意思)
PendingIntent可以看作是對Intent的封裝。PendingIntent主要持有的資訊是它所封裝的Intent和當前Application的Context。正由於PendingIntent中儲存有當前Application的Context,使它賦予帶他程式一種執行的Intent的能力,就算在執行時當前Application已經不存在了,也能通過存在PendingIntent裡的Context照樣執行Intent。
1 private void showNotify(){ 2 Notification notice=new Notification(); 3 notice.icon=R.drawable.icon; 4 notice.tickerText="您有一條新的資訊"; 5 notice.defaults=Notification.DEFAULT_SOUND; 6 notice.when=10L; 7 // 100 毫秒延遲後,震動 250 毫秒,暫停 100 毫秒後,再震動 500 毫秒 8 //notice.vibrate = new long[] { 100, 250, 100, 500 };出錯? 9 //notice.setLatestEventInfo(this, "通知", "開會啦", PendingIntent.getActivity(this, 0, null, 0)); 10 notice.setLatestEventInfo(this, "通知", "開會啦", PendingIntent.getActivity(this, 0, new Intent(this,Activity2.class), 0));//即將跳轉頁面,還沒跳轉 11 NotificationManager manager=(NotificationManager)getSystemService(this.NOTIFICATION_SERVICE); 12 manager.notify(0,notice); 13 }
1 private void showNotify(){ 2 Notification notice=new Notification(); 3 notice.icon=R.drawable.icon; 4 notice.tickerText="您有一條新的資訊"; 5 notice.defaults=Notification.DEFAULT_SOUND; 6 notice.when=10L; 7 // 100 毫秒延遲後,震動 250 毫秒,暫停 100 毫秒後,再震動 500 毫秒 8 //notice.vibrate = new long[] { 100, 250, 100, 500 };出錯? 9 //notice.setLatestEventInfo(this, "通知", "開會啦", PendingIntent.getActivity(this, 0, null, 0)); 10 notice.setLatestEventInfo(this, "通知", "開會啦", PendingIntent.getActivity(this, 0, new Intent(this,Activity2.class), 0));//即將跳轉頁面,還沒跳轉 11 NotificationManager manager=(NotificationManager)getSystemService(this.NOTIFICATION_SERVICE); 12 manager.notify(0,notice); 13 }
1 1. GSM網路中Android傳送簡訊樣本 2 3 Java代碼 4 String msg ="你好,美女"; 5 String number = "135****6784"; 6 SmsManager sms = SmsManager.getDefault(); 7 8 PendingIntent pi = PendingIntent.getBroadcast(SmsActivity.this,0,new Intent(...),0); 9 sms.sendTextMessage(number, null, msg, pi, null); 10 Toast.makeText(SmsActivity.this,"發送成功",Toast.LENGHT_LONG).show();
1 String msg ="你好,美女"; 2 String number = "135****6784"; 3 SmsManager sms = SmsManager.getDefault(); 4 5 PendingIntent pi = PendingIntent.getBroadcast(SmsActivity.this,0,new Intent(...),0); 6 sms.sendTextMessage(number, null, msg, pi, null); 7 Toast.makeText(SmsActivity.this,"發送成功",Toast.LENGHT_LONG).show();
代碼解釋
PendingIntent就是一個Intent的描述,我們可以把這個描述交給別的程式,別的程式根據這個描述在後面的別的時間做你安排做的事情 (By giving a PendingIntent to another application, you are granting it the right to perform the operation you have specified as if the other application was yourself,就相當於PendingIntent代表了Intent)。本例中別的程式就是傳送簡訊的程式,簡訊發送成功後要把intent廣播出去 。
函數SmsManager.sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)中參數解釋:
1)PendingIntent sentIntent:當簡訊發出時,成功的話sendIntent會把其內部的描述的intent廣播出去,否則產生錯誤碼並通過android.app.PendingIntent.OnFinished進行回調,這個參數最好不為空白,否則會存在資源浪費的潛在問題;
2)PendingIntent deliveryIntent:是當訊息已經傳遞給收信人後所進行的PendingIntent廣播。
查看PendingIntent 類可以看到許多的Send函數,就是PendingIntent在進行被賦予的相關的操作。
PendingIntent的一個很好的例子:
簡訊系統舉例SmsManager的用於傳送簡訊的方法:
sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);
第一個參數:destinationAddress對方手機號碼
第二個參數:scAddress簡訊中心號碼一般設定為空白
第三個參數:text簡訊內容
第四個參數:sentIntent判斷簡訊是否發送成功,如果你沒有SIM卡,或者網路中斷,則可以通過這個itent來判斷。注意強調的是“發送”的動作是否成功。那麼至於對於對方是否收到,另當別論
第五個參數:deliveryIntent當簡訊發送到收件者時,會收到這個deliveryIntent。即強調了“發送”後的結果
就是說是在"簡訊發送成功"和"對方收到此簡訊"才會啟用 sentIntent和deliveryIntent這兩個Intent。這也相當於是順延強制了Intent
上面兩個例子可以理解,PendingIntent就是一個可以在滿足一定條件下執行的Intent,它相比於Intent的優勢在於自己攜帶有Context對象,這樣他就不必依賴於某個activity才可以存在。
//////////////////////////////////////////////////////////////////////////////////////////////
PendingIntent的作用和舉例以及和Intent的區別
1、PendingIntent作用
根據字面意思就知道是延遲的intent,主要用來在某個事件完成後執行特定的Action。PendingIntent包含了Intent及Context,所以就算Intent所屬程式結束,PendingIntent依然有效,可以在其他程式中使用。
常用在通知欄及簡訊發送系統中。
PendingIntent一般作為參數傳給某個執行個體,在該執行個體完成某個操作後自動執行PendingIntent上的Action,也可以通過PendingIntent的send函數手動執行,並可以在send函數中設定OnFinished表示send成功後執行的動作。
2、PendingIntent舉例
a. 系統通知欄
NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);int icon = android.R.drawable.stat_notify_chat;long when = System.currentTimeMillis() + 2000;Notification n = new Notification(icon, "通知欄demo提醒", when);n.defaults = Notification.DEFAULT_SOUND;n.flags |= Notification.FLAG_AUTO_CANCEL;Intent openintent = new Intent(this, DemoList.class);PendingIntent pi = PendingIntent.getActivity(this, 0, openintent, PendingIntent.FLAG_CANCEL_CURRENT);n.setLatestEventInfo(this, "通知欄demo提醒title", "通知欄demo提醒text", pi);nm.notify(0, n);
setLatestEventInfo表示設定點擊該通知的事件
b. 簡訊系統舉例
以上的兩個PendingIntent sentPI和deliveredPI將分別在簡訊發送成功和對方接受成功時被廣播
3、Intent和PendingIntent的區別
a. Intent是立即使用的,而PendingIntent可以等到事件發生後觸發,PendingIntent可以cancel
b. Intent在程式結束後即終止,而PendingIntent在程式結束後依然有效
c. PendingIntent內建Context,而Intent需要在某個Context內運行
d. Intent在原task中運行,PendingIntent在新的task中運行
PendingIntent用於描述Intent及其最終的行為.
你可以通過getActivity(Context context, int requestCode, Intent intent, int flags)系列方法從系統取得一個用於啟動一個Activity的PendingIntent對象,
可以通過getService(Context context, int requestCode, Intent intent, int flags)方法從系統取得一個用於啟動一個Service的PendingIntent對象
可以通過getBroadcast(Context context, int requestCode, Intent intent, int flags)方法從系統取得一個用於向BroadcastReceiver的Intent廣播的PendingIntent對象
返回的PendingIntent可以遞交給別的應用程式,然後繼續處理。這裡的話你可以稍後才處理PendingIntent中描述的Intent及其最終行為。
當你把PendingIntent遞交給別的程式進行處理時,PendingIntent仍然擁有PendingIntent原程式所擁有的許可權(with the same permissions and identity).當你從系統取得一個PendingIntent時,一定要非常小心才行。比如,通常,如果Intent目的地是你自己的component(Activity/Service/BroadcastReceiver)的話,你最好採用在Intent中顯示指定目的component名字的方式,以確保Intent最終能發到目的,否則Intent最後可能不知道發到哪裡了。一個PendingIntent就是Android系統中的一個token(節點,這個應該是Linux或C\C++用語)的一個對象引用,它描述了一些將用於retrieve的資料(這裡,這些資料描述了Intent及其最終的行為)。
這就意味著即使PendingIntent原進程結束了的話, PendingIntent本身仍然還存在,可在其他進程(PendingIntent被遞交到的其他程式)中繼續使用.如果我在從系統中提取一個PendingIntent的,而系統中有一個和你描述的PendingIntent對等的PendingInent, 那麼系統會直接返回和該PendingIntent其實是同一token的PendingIntent,而不是一個新的token和PendingIntent。然而你在從提取PendingIntent時,通過FLAG_CANCEL_CURRENT參數,讓這個老PendingIntent的先cancel()掉,這樣得到的pendingInten和其token的就是新的了。
通過FLAG_UPDATE_CURRENT參數的話,可以讓新的Intent會更新之前PendingIntent中的Intent對象資料,例如更新Intent中的Extras。另外,我們也可以在PendingIntent的原進程中調用PendingIntent的cancel ()把其從系統中移除掉。
Android中pendingIntent的深入理解