2011-07-26 96 views
4

我有一個程序可以在其中調用通知。通知,如果你把它拉下來,就會啓動一個新的活動。來自通知的Android刷新活動

mNotificationManager = (NotificationManager) getSystemService(ns); 

int icon = R.drawable.stat_sys_secure_green; 
CharSequence tickerText = "Browser Security Enabled"; 
long when = System.currentTimeMillis(); 

notification = new Notification(icon, tickerText, when); 

Context context = getApplicationContext(); 
CharSequence contentTitle = "Browser Security"; 
CharSequence contentText = "Security Vulnerability Detected"; 
Intent notificationIntent = new Intent(this, PrivacyMessage.class); 

//Test Extra 
notificationIntent.putExtra("Primary Key", "Primary Text"); 

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 

mNotificationManager.notify(HELLO_ID, notification); 

問題出現在代碼後面,當我想刷新次要活動。主要活動應該能夠動態地更改其中的額外內容。我試圖通過啓動一個新的意圖來做到這一點。

CharSequence contentTitle = "Browser Security"; 
CharSequence contentText = "Test New Notification"; 
Intent intent = new Intent(this, PrivacyMessage.class); 
notification.icon = R.drawable.stat_sys_secure_orange; 

intent.putExtra("Test Thing", "Test Value"); 
//intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
//intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

PendingIntent cI = PendingIntent.getActivity(this, 0, intent, 0); 
notification.setLatestEventInfo(getApplicationContext(), "New Title", "NewText", cI); 
mNotificationManager.notify(HELLO_ID, notification); 

現在,當我執行的代碼,新通知標題彈出,圖標顏色的變化,和下拉反映新標題和附加信息。但是,當我點擊它時,它不會以新的意圖啓動活動。相反,它只是將舊的活動與舊的演員混爲一談。我嘗試了FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK,但似乎都沒有清除舊的輔助活動並創建了新的輔助活動。有關我如何做到這一點的任何想法?

+0

對不起,因爲我的誤解,但是你想發起一個沒有歷史的新活動,或者你希望舊活動在前臺並刷新其狀態? – mdelolmo

+0

我希望當按下通知時舊的活動會到達前臺,但需要更新一個新的意圖。 – Lark

+0

你能幫我解決我的問題嗎? http://stackoverflow.com/questions/20149685/android-notification-refresh-activity –

回答

10

顯然這實際上是android環境的一個bug /功能。除非使用唯一的requestCode傳遞一個pendingIntent(),否則它只是檢索最初通過該數字傳遞的舊意圖。

詳細信息可以在這裏找到: http://groups.google.com/group/android-developers/browse_thread/thread/ad855bb57042c2bd/e84c8d6fececf6e4?lnk=gst&q=notification#e84c8d6fececf6e4

他們想出了是簡單的增加requestCode每次pendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)被調用,並設置標誌我曾與

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
原來用同樣的方式解決方案

其中,似乎不是一個完美的解決方案,但它的工作原理。謝謝你們的幫助!

+3

或者更好地使用PendingIntent.FLAG_CANCEL_CURRENT標誌與PendingIntent.getActivity() – OferR

+1

PendingIntent.FLAG_CANCEL_CURRENT標誌與PendingIntent.getActivity()適用於我 – varghesekutty

0

我認爲,首先,你應該忘記FLAG_ACTIVITY_NEW_TASK,因爲這會打開一個新的任務(一組活動),而不清除以前打開的任何東西。 FLAG_ACTIVITY_CLEAR_TOP也不會對你有用,因爲如果我正確理解了場景,你的taks只有兩個活動,你的目標活動是次要的。

所以這裏是我的問題......如果第二段代碼在Activity上下文中執行,爲什麼不用startActivity來調用新的extras呢?這將允許您處理次要活動的onStart方法中的新增功能。

問候。

+0

我對startActivity的理解是它會立即啓動一個新的Activity。我想要發生的只是它從通知下拉菜單中啓動活動,但它是當時的更新版本。 我試了一下,檢查,它立即啓動一個新的活動,但隨後拋出一個android.app。SuperNotCalled異常。 – Lark

0

你是否覆蓋onNewIntent()來捕獲新的意圖,或者只是調用getIntent()? onNewIntent()文檔指出getIntent()將繼續返回用於啓動活動的原始意圖,除非您從onNewIntent()調用setIntent()。

+0

我其實只是調用getIntent。我剛纔嘗試添加簡單的:public void onNewIntent(Intent intent){this.setIntent(intent);}; }' 但它似乎什麼也沒做。我也只是試圖將我的onCreate方法格式更改複製到onNewIntent方法中。也沒有太多。還有什麼想法? – Lark