昨天幫朋友使用Android開(kāi)發(fā)定時(shí)提醒功能模塊,咋看這個(gè)功能挺簡(jiǎn)單的,但是其中涉及到的東西還挺多,這里我主要挑了PendingIntent來(lái)做介紹。
創(chuàng)新互聯(lián)是一家從事企業(yè)網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、行業(yè)門(mén)戶網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)制作的專業(yè)網(wǎng)絡(luò)公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁(yè)設(shè)計(jì)人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹(shù)立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來(lái)曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)上1000+。
什么是PendingIntent?
簡(jiǎn)單來(lái)說(shuō),PendingIntent其實(shí)就是用來(lái)指定在某個(gè)操作之后,下一步做什么。打個(gè)比方:老大說(shuō)我們?cè)陧?xiàng)目完成之后就要發(fā)獎(jiǎng)金,發(fā)獎(jiǎng)金這件事情在項(xiàng)目完成之后將觸發(fā)的操作,就相于PendingIntent。
什么時(shí)候會(huì)用PendingIntent?
PendingIntent通常會(huì)用在定時(shí)提醒及發(fā)送Notification消息時(shí),用來(lái)指定到達(dá)指定時(shí)間及點(diǎn)擊Notification消息之后的操作。例如以下代碼:
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,task.getDateTime().getMillis(), 30*1000, pendingIntent);
上述代碼是一個(gè)定時(shí)提醒的功能,pendingIntent參數(shù)用于指定到達(dá)指定時(shí)間是該做何種操作。
PendingIntent提供的操作?
目前PendingIntent提供了三項(xiàng)操作:啟動(dòng)Activity、啟動(dòng)Service以及發(fā)送廣播,它的實(shí)例化是通過(guò)
PendingIntent的三個(gè)靜態(tài)方法來(lái)完成, getActivity(Context, int, Intent, int)
, getBroadcast(Context, int, Intent, int)
, getService(Context, int, Intent, int),
這三個(gè)方法與前面三項(xiàng)操作是一一對(duì)應(yīng)的。
PendingIntent參數(shù)解釋
以 getActivity
為例我們來(lái)介紹PendingIntent參數(shù)。SDK的API中對(duì) getActivity
是這樣解釋的:
這里我們主要介紹flags參數(shù),這個(gè)參數(shù)比較重要,也較難理解。繼續(xù)閱讀API文檔,文檔告訴我們flags可能的值有如下幾個(gè):FLAG_ONE_SHOT
, FLAG_NO_CREATE
, FLAG_CANCEL_CURRENT
, FLAG_UPDATE_CURRENT
。
現(xiàn)在我們分別來(lái)看看這幾個(gè)值是什么意思:
這個(gè)參數(shù)的含義是:當(dāng)做了啟動(dòng)Activity這件事情之后,后面再去做啟動(dòng)Activity這件事,都是無(wú)效的。
這個(gè)參數(shù)的含義是:如果PendingIntent不存在,那么直接返回null而不創(chuàng)建。一般來(lái)說(shuō)這個(gè)用的比較少。
這個(gè)參數(shù)的含義是:如果PendingIntent如果存在的話,那么首先取消它,然后再創(chuàng)建。
這個(gè)參數(shù)的含義是:PendingIntent如果存在,那么繼續(xù)保持它,并用新的Intent里面的Extras數(shù)據(jù)替換這個(gè)PendingIntent里面Intent的Extras數(shù)據(jù)。
PendingIntent存在性判定
看到上面PendingIntent參數(shù)的解釋,我們發(fā)現(xiàn)這幾個(gè)參數(shù)大多與PendingIntent的存在性有關(guān)。那么通過(guò)getActivity這個(gè)方法拿到的PendingIntent是已經(jīng)存在的還是新創(chuàng)建的?這里我們通過(guò)閱讀源碼來(lái)找到問(wèn)題的答案。首先找到PendingIntent.getActivity方法。
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags, Bundle options) { String packageName = context.getPackageName(); String resolvedType = intent != null ? intent.resolveTypeIfNeeded( context.getContentResolver()) : null; try { intent.setAllowFds(false); IIntentSender target = ActivityManagerNative.getDefault().getIntentSender( ActivityManager.INTENT_SENDER_ACTIVITY, packageName, null, null, requestCode, new Intent[] { intent }, resolvedType != null ? new String[] { resolvedType } : null, flags, options, UserHandle.myUserId()); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { } return null; }
從這個(gè)方法里面,我們發(fā)現(xiàn),PendingIntent是跟Target有關(guān),并且每次拿到的PendingIntent的內(nèi)存地址都不是同一個(gè),所以PendingIntent不是通過(guò)"=="運(yùn)算來(lái)比較存在性的,我們找到PendingIntent的equals方法。
@Override public boolean equals(Object otherObj) { if (otherObj instanceof PendingIntent) { return mTarget.asBinder().equals(((PendingIntent)otherObj) .mTarget.asBinder()); } return false; }
我們發(fā)現(xiàn)是比較mTarget的Binder,那mTarget是什么?mTarget就是我們getActivity方法里面見(jiàn)到的target,所以這里我們可以說(shuō):PendingIntent存在性是與mTarget有關(guān),而與PendingIntent本身無(wú)關(guān)。
通過(guò)target的獲取方式,我們不難猜測(cè)一下target存在性是與request,intent,context有關(guān)。我們?cè)俳Y(jié)合API文檔來(lái)看一下:
這里描述的是與operation、intent的action、data、categories等等有關(guān)。所以如果要讓兩個(gè)PendingIntent不同,可以通過(guò)設(shè)置intent的data參數(shù):例如:intent2.setData(Uri.parse("task://12");同樣你也可以改變其他值來(lái)讓PendingIntent不同。
再結(jié)合上面 FLAG_ONE_SHOT
, FLAG_NO_CREATE
, FLAG_CANCEL_CURRENT
, FLAG_UPDATE_CURRENT
來(lái)理解一下。
FLAG_ONE_SHOT->target是否相同->如果相同則看send()方法是否調(diào)用->如果已經(jīng)調(diào)用了,則不做任何操作。
FLAG_NO_CREATE
->target是否存在->如果不存在返回null
FLAG_CANCEL_CURRENT
->target是否存在->如果存在則取消操作,重新生成一個(gè)target
FLAG_UPDATE_CURRENT->target是否存在->保持target,將intent的extras值更新
好了,以上是本人的一些淺見(jiàn),希望對(duì)你有所幫助!
當(dāng)前標(biāo)題:Android之PendingIntent
文章地址:http://m.rwnh.cn/article40/ippoho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、定制開(kāi)發(fā)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、Google、軟件開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)