轉載: PendingIntenthtml
2010-11-16 00:03:55java
標籤:PendingIntent Intent SmsManager getBroadcast BroadcastReveiver android
原創做品,容許轉載,轉載時請務必以超連接形式標明文章 原始出處 、做者信息和本聲明。不然將追究法律責任。http://lbrant.blog.51cto.com/2400264/424154 網絡
Intent和PendingIntent的關係,初學的時候很迷惑,用PendingIntent的時候,還會出現奇怪的問題,好比沒法傳遞數據,沒法更新數據,因此我集衆家之長,加上我我的的一些實踐,總結以下,但願能給你一些幫助。app
首先看官方解釋:An Intent is something that is used right now; a PendingIntent is something that may create an Intent in the future. You will use a PendingIntent with Notifications, AlarmManager, etc. ide
Intent你們都很熟悉了,就是一個意圖,這個意圖代表要啓動哪一個Activity,Service,PendingIntent能夠看做是對Intent的進一步封裝,它是對Intent的描述,咱們能夠把這個描述交給別的程序,別的程序根據這個描述在後面的時間作你安排作的事情,下面是一個發送SMS短信的例子:ui
String msg ="你好"; String number = "135****6784"; SmsManager sms = SmsManager.getDefault(); PendingIntent pi = PendingIntent.getBroadcast(SmsActivity.this,0,new Intent(XXX),0); sms.sendTextMessage(number, null, msg, pi, null); Toast.makeText(SmsActivity.this,"發送成功",Toast.LENGHT_LONG).show();
方法SmsManager.sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent):this
PendingIntent sentIntent:當短信發出時,成功的話sendIntent會把其內部的描述的intent廣播出去,固然失敗以後會產生錯誤代碼,並經過 android.app.PendingIntent.OnFinished進行回調("Callback");spa
PendingIntent deliveryIntent:是當消息已經傳遞給收信人後所進行的Intent廣播;.net
若是你的BroadcastReveiver註冊接收相應的消息,你就會收到相應的Intent,這時候就能夠根據Intent的Action,執行相應的動做,這就是上面說的in the future的含義;
有三個靜態方法能夠得到PendingIntent實例:
public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags)
public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags)
flags參數有三個,我以爲英文更好理解:
FLAG_ONE_SHOT:this PendingIntent can only be used once. If set, after send() is called on it, it will be automatically canceled for you and any future attempt to send through it will fail.
FLAG_UPDATE_CURRENT: if the described PendingIntent already exists, then keep it but its replace its extra data with what is in this new Intent. This can be used if you are creating intents where only the extras change, and don't care that any entities that received your previous PendingIntent will be able to launch it with your new extras even if they are not explicitly given to it.
這個簡單解釋一下,就是當存在時,先把原來的取消,而後建立一個新的,在AlarmManager服務時,修改一個鬧鈴,用的比較笨的的方法,先取消,而後從新註冊,其實加上這個參數就好了。
要注意的是,這個只更新extra data,不會修改其餘內容,不能new一個Intent,還有就是若是你的Intent中須要傳遞Id或者其餘數據,必定要用這個flags或者FLAG_CANCEL_CURRENT,曾經一直接收不到Id,查了半天原來是這個緣由 :-(
LAG_NO_CREATE:if the described PendingIntent does not already exist, then simply return null instead of creating it.
LAG_CANCEL_CURRENT:if the described PendingIntent already exists, the current one is canceled before generating a new one.You can use this to retrieve a new PendingIntent when you are only changing the extra data in the Intent; by canceling the previous pending intent, this ensures that only entities given the new data will be able to launch it. If this assurance is not an issue, consider FLAG_UPDATE_CURRENT.
上面4個flag中最常用的是FLAG_UPDATE_CURRENT,由於描述的Intent有更新的時候須要用到這個flag去更新你的描述(確切的說是更新extra data),不然組件在下次事件發生或時間到達的時候extras永遠是第一次Intent的extras,使用FLAG_CANCEL_CURRENT也能作到更新extras,只不過是先把前面的extras清除,另外FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT的區別在於可否新new一個Intent,FLAG_CANCEL_CURRENT可以新new一個Intent,而FLAG_UPDATE_CURRENT則不能,只能使用第一次的Intent。
還有一個問題就是怎麼區分PendingIntent,主要取消的時候要用到,requestCode能夠區分,但系統仍是根據Intent的Action去區分的,若是Intent設置了Class,classData,取消的時候Intent必定要設置要相同的,否則取消不掉就可能出現取消後,Alarm還會響的問題,PendingIntent用的地方蠻多的,像 Notifications, AlarmManager等都會用到。。。
如下是參考的文章:
http://yichen914.spaces.live.com/blog/cns!723590D920FAF62B!703.entry
http://hi.chinaunix.net/?uid-21747227-action-viewspace-itemid-48368
http://jimmymouse.javaeye.com/blog/760505
本文出自 「超越夢想」 博客,請務必保留此出處http://lbrant.blog.51cto.com/2400264/424154
------------------------------------------------------------------------------------------------------------------------------------------
pendingIntent字面意義:等待的,未決定的Intent。
要獲得一個pendingIntent對象,使用方法類的靜態方法 getActivity(Context, int, Intent, int)
, getBroadcast(Context, int, Intent, int)
, getService(Context, int, Intent, int) 分別對應着Intent的3個行爲,跳轉到一個activity組件、打開一個廣播組件和打開一個服務組件。
pendingIntent是一種特殊的Intent。主要的區別在於Intent的執行馬上的,而pendingIntent的執行不是馬上的。pendingIntent執行的操做實質上是參數傳進來的Intent的操做,可是使用pendingIntent的目的在於它所包含的Intent的操做的執行是須要知足某些條件的。
參數有4個,比較重要的事第三個和第一個,其次是第四個和第二個。能夠看到,要獲得這個對象,必須傳入一個Intent做爲參數,必須有context做爲參數。
主要的使用的地方和例子:通知Notificatio的發送,短消息SmsManager的發送和警報器AlarmManager的執行等等。
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);
mNotificationManager.notify(0, notification);//第一個參數爲自定義的通知惟一標識
重點是setLatestEventInfo( )方法的最後一個參數!!!!它是一個PendingIntent!!!!!!!!!
這裏使用到了PendingIntent(pend本意是待定,不肯定的意思)
PendingIntent能夠看做是對Intent的包裝。PendingIntent主要持有的信息是它所包裝的Intent和當前Application的Context。正因爲PendingIntent中保存有當前Application的Context,使它賦予帶他程序一種執行的Intent的能力,就算在執行時當前Application已經不存在了,也能經過存在PendingIntent裏的Context照樣執行Intent。
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才能夠存在。