2012-06-15 224 views
0

我被困在一個愚蠢的問題上幾個小時。Android活動意向啓動

我的應用程序由2個活動組成:A(主)和B.還有一個服務S. 「正常」任務堆棧是AB和S在後臺運行。

我想直接用通知到達活動B,就會出現我的問題。我必須構建任務堆棧以獲取AB以保持返回按鈕的默認行爲。 (我希望用戶可以回到A)。

因爲我已經使用API​​ 7,所以我無法使用android開發人員教程http://developer.android.com/guide/topics/ui/notifiers/notifications.html中顯示的intent數組。 因此,我決定在通知發送的意圖中添加自定義操作(S.ACTION_CUSTOM),以便在活動A的onCreate()中區分此情況。

與在服務S:

Intent notificationIntent = new Intent(this, A.class); 
     notificationIntent.setAction(ACTION_CUSTOM); 
在一個

現在,在onCreate()方法的最後,我想補充:

if (S.ACTION_CUSTOM.equals(getIntent().getAction())) { 
     Intent intent = new Intent(this, B.class); 
     intent.setAction(S.ACTION_CUSTOM); 
     startActivity(intent); 
} 

此代碼的工作,直接從通知到B和授權總回報A. 但是一次我使用通知「shorcut」,然後在應用程序啓動時直接到達B,即使從主菜單中也是如此。 我已經嘗試了很多事情來理解發生了什麼,但即使我在A中的if語句的末尾添加getIntent()。setAction(ANYTHING),行爲也是一樣的。

有誰能告訴我發生了什麼事嗎?莫洛弗我開放的心態與其他方法來實現我的願望。

謝謝。

編輯:XML清單的

部分:

<activity 
     android:name=".A" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
</activity> 
<activity 
     android:name=".B" 
     android:label="@string/app_name" > 
</activity> 

但我認爲意圖過濾無關與我的問題。

+0

在活動B從通知中打開的情況下,*必須*後退按鈕打開活動A?這是不正常的android'流' - 迴應該回到以前的屏幕 – barry

+0

@barry,你說得對我沒有正確表達我自己我不想要正常的Android流量,因爲在我的情況下,通知是一個正在進行的服務,如果返回按鈕顯示活動A,它將更加用戶友好。 – FabiF

+0

發佈您的manifest.xml –

回答

1

隨着更多的測試,我找到了原因和解決方案。

事實上,當我說我從主菜單中重新啓動應用程序時,它是不正確的。我把它從「最近的活動」中解放出來(長時間在家中)。 但是,在這種情況下,似乎android會以啓動它的最後一個意圖啓動應用程序。所以它在家中正常工作(因爲Intent.ACTION_MAIN的新意圖是fire),但不是來自最近的活動,因爲先前具有相同動作的意圖被反覆觸發(在我的情況下爲ACTION_CUSTOM)。

爲了區別「近期活動」和「通知」的意圖,我使用了標誌。對於最近的活動,該意圖具有標誌Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY。

所以我用if語句添加一個條件定勢我的代碼:

if (S.ACTION_CUSTOM.equals(getIntent().getAction()) && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { 
     startActivity(getIntent().setClass(this, B.class)); 
} 

我真正的代碼是4周的活動,而不是2更復雜一些,但一切工作正常,每個活動發送意圖下一個。這個堆棧很好地建立起來,當用戶從其他地方啓動應用程序時,默認的行爲是保留的。

希望這會幫助某人避免失去時間來理解爲什麼意圖看起來很瘋狂。