Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> Android 如何設置 Notification 中PendingIntent 的 Intent

Android 如何設置 Notification 中PendingIntent 的 Intent

編輯:高級開發

已經凌晨了,外面下著該死的雨,把我阻擋在教學樓卻不能回寢室(其實主要是我沒有可以換的衣服和褲子了,如果沖回去的話...後果可想而知 :)),並且還有那該死的Notification 中 PendingIntent 中的 Intent 卻老是配置不好,不過令人欣慰和激動的是我還是搞定了,嘿嘿。廢話少說,言歸正傳。

  今天在寫完 “ android Notification 的使用 ” 的時候,發現有幾個問題,特別是設置Notification的Intent使之能夠像 QQ 或其他程序一樣能夠正確回調到之前已經放置在後台的Task中的對應Activity,而不是創建它的一個新實例。當然重點便是如何設置該 Activity 的 launchMode 與 Intent 的 Flags 了,說到這裡,我不得不說一下今晚的調試經歷,當然這裡所說的所有的Notification都設置了FLAG_ONGOING_EVENT。

  按照 “ (轉載)android下AffinitIEs和Task ”一文所說的,我們不難得出這樣的結論:

  1、設置當用戶觸發Notification時所發出的Intent,如果設置 FLAG_ACTIVITY_CLEAR_TOP 與 FLAG_ACTIVITY_NEW_TASK ,而launchMode保持不變(即默認為:standard),則當用戶用手點擊Notification時,此時匹配到後台的Task,並把在堆棧中對應要啟動的Activity之前的所有Activity全部清除掉,並且由於 standard 默認對於新的Intent總是創建新的Activity對象。因此存在於該Task中舊的Activity也會被清除掉,然後在該Task中創建新的 Activity對象。

  2、設置當用戶觸發Notification時所發出的Intent,如果設置 FLAG_ACTIVITY_CLEAR_TOP 與 FLAG_ACTIVITY_NEW_TASK,而launchMode設置為singleTop,則當用戶用手點擊Notification時,同1一樣,只是存在於該Task中舊的Activity不會被清除掉,此時Intent傳遞給已經存在的Activity並不會創建新的Activity。

  上面得出的結論,經過返回測試,1是正確的,2卻存在著很莫名奇妙的問題

  假設現在有個程序X,有2個Activity,分別是 A , B ,其中 A 是 設置了android.intent.action.MAIN的Activity(入口Activity),兩者的launchMode都為默認的 standard,創建該Intent的代碼如下:

  Intent intent = new Intent(this, A.class);

  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);

  很明顯我們設置的是當用戶點擊 Notification 時,應該出現的是 A Activity,但無論如何按home鍵退出當前Task,並使之成為後台Task,在從程序列表啟動該程序總能恢復到Task頂端的Activity 給用戶,如

  接上頁

當前 B,按home鍵,在從程序列表啟動 X ,這個時候出現的Activity任然是 B,但按照如下的方法操作卻會使得從程序列表啟動 X,出現的是新創建的A Activity,其中經過Log打印得知下面的所有Activity都在同一個Task中

  1、打開程序出現A,從A startActivity 到B,按Home鍵,點Notification出現A,再從A startActivity 到 B,按Home鍵,從程序列表打開程序 出現新創建的實例A

  2、打開程序出現A,從A startActivity 到B,點Notification出現A,再從A startActivity 到B,按Home鍵,從程序列表打開程序也出現了新創建的實例A

  這裡所說的“新創建的實例A”都是創建在同一Task中的新的A Activity實例,也就是說按照以上兩種方法,再按返回鍵,出現的則是 B,再按返回鍵出現的則是 A。這裡我實在想不出為什麼會在同一Task中創建一個新的Activity,就算從程序列表打開程序的Intent使用了 FLAG_ACTIVITY_NEW_TASK標記,我也不知道為什麼,如果有朋友知道,一定要告訴我。

  到這裡,我開始發現 從程序列表啟動 的優越性,因為不管是在什麼時候按Home,再次從程序列表啟動時,總能返回到Task的棧頂Activity。起初我想過一個辦法,便是重載 Activity寫一個類實現當onResume的時候更新Notification,然後我的所有Activity類都直接從該類繼承,使得當按 Home 之後總能讓Notification記住Task的棧頂Activity,就像QQ一樣,但這種方法當然有點牽強,於是我開始看SDK 中 有關Home的Simple,終於發現了如果使用如下的Intent,便不會調用對應的Activity,而是調用Task中的棧頂Activity

  Intent intent = new Intent(Intent.ACTION_MAIN);

  intent.addCategory(Intent.CATEGORY_LAUNCHER);

  intent.setClass(this, Main.class);

  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

  除了 setClass 可以換成使用 setClassName 綁定,FLAG_ACTIVITY_RESET_TASK_IF_NEEDED可以不設,其他的選項都缺一不可。設置ACTION_MAIN與 CATEGORY_LAUNCHER是把該Intent發給了系統對應創建程序的模塊,然後系統該模塊根據設定的包與類信息還有flags進行處理。當然所有的Intent工作原理都是這樣,只是對 ACTION_MAIN - CATEGORY_LAUNCHAR 的處理較為特殊,使得總是顯示Task棧頂的Activity而不是setClass設定的Activity類。

  當然我剛接觸android才一周左右,如果有什麼說得不對的地方,還請網友們指出來。

  分類: android 專題

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved