成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Android之PendingIntent

    昨天幫朋友使用Android開發(fā)定時提醒功能模塊,咋看這個功能挺簡單的,但是其中涉及到的東西還挺多,這里我主要挑了PendingIntent來做介紹。

創(chuàng)新互聯(lián)是一家從事企業(yè)網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計制作的專業(yè)網(wǎng)絡(luò)公司,擁有經(jīng)驗豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨(dú)特的設(shè)計風(fēng)格。自公司成立以來曾獨(dú)立設(shè)計制作的站點(diǎn)上1000+。

   什么是PendingIntent?

    簡單來說,PendingIntent其實就是用來指定在某個操作之后,下一步做什么。打個比方:老大說我們在項目完成之后就要發(fā)獎金,發(fā)獎金這件事情在項目完成之后將觸發(fā)的操作,就相于PendingIntent。

   什么時候會用PendingIntent?

    PendingIntent通常會用在定時提醒及發(fā)送Notification消息時,用來指定到達(dá)指定時間及點(diǎn)擊Notification消息之后的操作。例如以下代碼:

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,task.getDateTime().getMillis(), 30*1000, pendingIntent);

    上述代碼是一個定時提醒的功能,pendingIntent參數(shù)用于指定到達(dá)指定時間是該做何種操作。

  PendingIntent提供的操作?

    目前PendingIntent提供了三項操作:啟動Activity、啟動Service以及發(fā)送廣播,它的實例化是通過

PendingIntent的三個靜態(tài)方法來完成, getActivity(Context, int, Intent, int)getBroadcast(Context, int, Intent, int)getService(Context, int, Intent, int),這三個方法與前面三項操作是一一對應(yīng)的。

  PendingIntent參數(shù)解釋

    以 getActivity為例我們來介紹PendingIntent參數(shù)。SDK的API中對 getActivity是這樣解釋的:

Android之PendingIntent

    這里我們主要介紹flags參數(shù),這個參數(shù)比較重要,也較難理解。繼續(xù)閱讀API文檔,文檔告訴我們flags可能的值有如下幾個:FLAG_ONE_SHOTFLAG_NO_CREATEFLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENT。

    現(xiàn)在我們分別來看看這幾個值是什么意思:

Android之PendingIntent

    這個參數(shù)的含義是:當(dāng)做了啟動Activity這件事情之后,后面再去做啟動Activity這件事,都是無效的。

Android之PendingIntent    

    這個參數(shù)的含義是:如果PendingIntent不存在,那么直接返回null而不創(chuàng)建。一般來說這個用的比較少。

Android之PendingIntent

    這個參數(shù)的含義是:如果PendingIntent如果存在的話,那么首先取消它,然后再創(chuàng)建。

Android之PendingIntent

    這個參數(shù)的含義是:PendingIntent如果存在,那么繼續(xù)保持它,并用新的Intent里面的Extras數(shù)據(jù)替換這個PendingIntent里面Intent的Extras數(shù)據(jù)。

    PendingIntent存在性判定

    看到上面PendingIntent參數(shù)的解釋,我們發(fā)現(xiàn)這幾個參數(shù)大多與PendingIntent的存在性有關(guān)。那么通過getActivity這個方法拿到的PendingIntent是已經(jīng)存在的還是新創(chuàng)建的?這里我們通過閱讀源碼來找到問題的答案。首先找到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;
    }

    從這個方法里面,我們發(fā)現(xiàn),PendingIntent是跟Target有關(guān),并且每次拿到的PendingIntent的內(nèi)存地址都不是同一個,所以PendingIntent不是通過"=="運(yùn)算來比較存在性的,我們找到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方法里面見到的target,所以這里我們可以說:PendingIntent存在性是與mTarget有關(guān),而與PendingIntent本身無關(guān)。

    通過target的獲取方式,我們不難猜測一下target存在性是與request,intent,context有關(guān)。我們再結(jié)合API文檔來看一下:

Android之PendingIntent

    這里描述的是與operation、intent的action、data、categories等等有關(guān)。所以如果要讓兩個PendingIntent不同,可以通過設(shè)置intent的data參數(shù):例如:intent2.setData(Uri.parse("task://12");同樣你也可以改變其他值來讓PendingIntent不同。

    再結(jié)合上面 FLAG_ONE_SHOTFLAG_NO_CREATEFLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENT來理解一下。

  • FLAG_ONE_SHOT->target是否相同->如果相同則看send()方法是否調(diào)用->如果已經(jīng)調(diào)用了,則不做任何操作。

  • FLAG_NO_CREATE->target是否存在->如果不存在返回null

  • FLAG_CANCEL_CURRENT->target是否存在->如果存在則取消操作,重新生成一個target

  • FLAG_UPDATE_CURRENT->target是否存在->保持target,將intent的extras值更新

    好了,以上是本人的一些淺見,希望對你有所幫助!

當(dāng)前標(biāo)題:Android之PendingIntent
文章地址:http://jinyejixie.com/article40/ippoho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)定制開發(fā)、手機(jī)網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈、Google、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
包头市| 韶山市| 东乌珠穆沁旗| 沂源县| 永城市| 卢湾区| 清远市| 武威市| 乐昌市| 阳信县| 大洼县| 和林格尔县| 西乌珠穆沁旗| 乌兰察布市| 华安县| 汾西县| 扎囊县| 方城县| 罗城| 麻城市| 秦安县| 中方县| 伊吾县| 横峰县| 望谟县| 山丹县| 安徽省| 城口县| 曲麻莱县| 朝阳区| 诏安县| 古田县| 吉安市| 寻乌县| 常山县| 民权县| 和顺县| 峨边| 平山县| 若羌县| 汉源县|