2012-07-08 38 views
1

我有一個'列表'活動,點擊時開始'文章'活動。 我也有推送通知,直接打開'文章'活動。如何正確定義活動和意圖以按照需要行事?

我改變了後退按鈕行爲在「文章」活動啓動「清單」的活動,從通知到來時,這樣用戶將返回到文章列表。

問題是,當應用程序在後臺已經打開,我打開的通知 - 它只是把它帶回前面。 我想要實現的是打開正確的文章,當點擊通知並返回到「列表」活動時,沒有可能列表活動將打開兩次。

我試圖分開的「文章」的任務,並創建通知意向新的任務,但隨後打開多個通知,並單擊後退時,它會打開單獨的「清單」的活動。

什麼是確定活動的任務和意圖的標誌,以實現我的目標的正確方法是什麼?

編輯: 清單部分:

<activity android:name="ListFeed" android:configChanges="orientation|screenLayout" android:launchMode="singleInstance" android:screenOrientation="unspecified" 
     android:taskAffinity="com.app.MyTask"></activity> 
     <activity android:name="Article" android:launchMode="standard" android:configChanges="orientation|screenLayout" android:screenOrientation="unspecified" 
      android:taskAffinity="com.app.MyTask"></activity> 

通知意向:

Intent notificationIntent = new Intent(context, Article.class); 
PendingIntent contentIntent = PendingIntent.getActivity(context, notificationID, notificationIntent, PendingIntent.FLAG_ONE_SHOT); 

謝謝!

+0

發佈您的清單,並顯示您用於爲通知創建PendingIntent的代碼。 – 2012-07-08 19:31:45

+0

發佈爲編輯問題 – 2012-07-08 20:20:41

回答

0

我從你的問題得到的是 1)你有一個listActivity

2)ArticalActivity B.

I)和第一要打開活動A的B每當回來,對不對?對於您可以使用dispatchKeyEvent,聽後退按鈕事件,並開始活動A.或者使用下面的代碼

@Override 
public void onBackPressed() { 
    Intent intent = new Intent(this, MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
} 

二)要打開活動A(表)的唯一一個實例。爲此,您基本上可以使用 launchMode將Activity A的Manifest declration設置爲singleInstance

android:launchMode="singleTask" 

您可以閱讀docs爲啓動模式

讓我知道,如果我錯過了什麼。

+0

請不要使用singleInstance。這是這個問題的錯誤解決方案。 singleInstance用於HOME屏幕替換。 – 2012-07-08 19:30:38

+0

ok,有一個標籤叫做android:excludeFromRecent =「true」在你的文章活動的清單聲明中使用這個標籤。試試這個。並讓我知道它是否有效 – AAnkit 2012-07-08 20:38:47

+0

謝謝@Ankit!它似乎解決了這個問題。我確實希望它出現在「最近的應用」列表中。現在,此活動無法從「最近的應用程序」返回。有其他選擇嗎? – 2012-07-09 05:21:32

0

我看到你有launchModes和excludeFromRecents玩耍,這是不是一件好事。 Android的標準行爲應該做你想要的東西。

爲了驗證這一點,我已經創建了一個包含MainActivity,一個ListActivity和ArticleActivity簡單的3-活動應用。我沒有使用任何非標準的啓動模式,也沒有設置任何意圖標誌(onBackPressed()見下文)。主要活動創建併發布通知以顯示特定的文章。 MainActivity啓動ListActivity。 ListActivity的每個元素啓動ArticleActivity的Intent並傳遞EXTRAS中的一些信息,以便ArticleActivity知道要顯示哪篇文章。

爲了使您描述的行爲(即:從通知啓動應用程序後從ArticleActivity返回到ListActivity,即使應用程序未運行),我已經完成了Ankit建議的操作(即:覆蓋ArticleActivity onBackPressed())是這樣的:

@Override 
public void onBackPressed() { 
    // Return to ListActivity 
    Intent intent = new Intent(this, ListActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    startActivity(intent); 
    // Finish this activity (in case the ListActivity wasn't already in the stack) 
    finish(); 
} 

我用FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP,因爲這將重建ListActivity如果它已經在活動堆(即存在:它會回到同一個實例)。

我不得不添加的finish()電話,因爲如果應用程序沒有在後臺運行,用戶從通知開始吧,ListActivity將被創建,並把上的的ArticleActivity頂部。然後,當用戶按下「返回」離開ListActivity時,ArticleActivity將暴露在下方。在這裏添加finish()使ArticleActivity消失,以便從ListActivity中按下「後退」回到它所來自的任何地方。

如果您希望我向您發送代碼,請告訴我。

+0

謝謝。與ListActivity的問題已解決。唯一仍然存在的問題是以新的意圖重新開啓了文章活動。用onNewIntent解決它 – 2012-07-09 12:48:28