1. 程式人生 > >關於在接收推送訊息後PendingIntent傳參問題

關於在接收推送訊息後PendingIntent傳參問題

一般接收到推送訊息通過PendingIntent設定跳轉到指定的Activity,同時也肩負著傳值的使命,下面詳細講解下PendingIntent建立的引數吧:

假如我們這樣建立:

Intent intent = new Intent(context,mainActivity.class);

PendingIntent  pi = PendingIntent.getActivity(context,id,intent,flag);

這裡有4個引數,其中第一個的context和第三個intent就不做多說了,大家一看就明白;

首先來說一下最後一個flag引數,分別是:

int FLAG_CANCEL_CURRENT:如果該PendingIntent已經存在,則在生成新的之前取消當前的,也就是說只有最後的PendingIntent有效,之前的都無效。

int FLAG_NO_CREATE:如果該PendingIntent不存在,直接返回null而不是建立一個PendingIntent.

int FLAG_ONE_SHOT:該PendingIntent只能用一次,在send()方法執行後,自動取消。

int FLAG_UPDATE_CURRENT:如果該PendingIntent已經存在,則用新傳入的Intent更新當前的資料。

由以上四個flag可以看出,如果我們想通過PendingIntent傳值,並且每次傳值都不同的話,就應該使用FLAG_UPDATE_CURRENT,但是這時不要忘記第二個引數,

假設第二個引數id為常量,比如0,那麼所對應的Intent裡面的extra的內容將更新為最新,也就是說所以的資料都是最新的;相反如果每次的id值不同,則Intent裡面內

容不會被更新,所以要使你的Intent裡面的內容不同就應該保持第二個引數每次都不相同。

同樣在做專案過成功,發現通過PendingIntent能傳遞不同的值,但是再將得到的值通過intent傳遞給,以singTask方式啟動的Activity時,在此Activity已經啟動的情況下獲得

不到由新Intent傳遞過來的值,每次在onResume中都是獲得到之前的intent,為了解決這個問題,就必須瞭解4種啟動方式的區別,這裡就不再多說了,總之為了解決獲得最新

的Intent的問題,總結下activity通過intent傳遞資料的時候,如果activity未啟動,那麼在這個剛啟動的activity裡通過getIntent()會獲取到這個intent的資料.如果要啟動的activity是

已經存在的,這時候通過getInten()方法獲取到的intent是已啟動的activity的原始intent.換句話說intent的資料沒有更新.這樣在已啟動的activity裡拿到的intent的資料是舊資料.如

果要每次獲取intent傳來的新資料就需要在onNewIntent(Intent intent)方法裡呼叫setIntent(intent)設定這個傳來的最新的intent.