2016-01-28 20 views
0

我想從活動A移至活動B,然後再移至A。在片段之間移動以正確使用背部堆棧的正確方法

A是父活動,以這種方式在android.manifest定義:

<activity 
    android:name=".ui.map.view.AActivity" 
    android:screenOrientation="portrait" 
    android:launchMode="singleTop" 
    android:windowSoftInputMode="adjustPan" /> 

雖然B被定義如下:

<activity 
     android:name=".ui.addwifi.view.BActivity" 
     android:noHistory="true" 
     android:screenOrientation="portrait" 
     android:windowSoftInputMode="adjustResize"> 

我使用這個調用來從A移動到B :

從B到A
public void openBActivity(UserData user) { 
    Intent intent = new Intent(getApplicationContext(), BActivity.class); 
    intent.putExtra(BActivity.SSID, BActivity.getWifi_ssid().replace("\"", "")); 

    if (user != null) { 
     intent.putExtra(BActivity.LATITUDE, user.getLatitude()); 
     intent.putExtra(BActivity.LONGITUDE, user.getLongitude()); 
     intent.putExtra(BActivity.ZOOM_LEVEL, (int) user.zoom); 
    } 

    startActivity(intent); 
} 

和:

public void openAActivity() { 
    Intent intent = new Intent(context, SpotsMapActivity.class); 
    startActivity(intent); 
} 

問題是,當我在A中按回時,它將移動到另一個未退出應用程序的Activity A中。我想要做的是從A到B,從B到A和從A到A(退出按鈕)。

Activity navigation flow

我已閱讀Google docs about back navigation但它不爲我工作。

回答

1

其中之一,你正在使用活動在這裏,沒有片段正在使用。也許你可以使用Fragments(?),然後當你按下Back時,你基本上從Activity中退出(如果你沒有將Fragments添加到BackStack中)。這會給你你需要的行爲。

由於您目前正在實施,您需要退出應用程序,當您從活動B按回正確嗎?在這種情況下,當您將它移動到B時,您需要關閉活動A.只需調用finish()方法即可。把它放在startActivity(意向)調用之後:

startActivity(intent); 
finish(); 

這應該平倉活動A,然後開始B.這是一種像關A的下一個強力爲了讓高雅,只要確保你關閉爲了避免泄漏,A可能掛着任何資源。

正如一個側面說明,當您啓動一個新的Activity時,Android的預期行爲是將另一個Activity置於停止狀態,但仍然在Activity堆棧中。由於您正在擺脫Android的設計原則,也許片段可能更適合您的需求 - 我不知道您究竟在做什麼,但我強烈建議人們在重新考慮Android設計之前再考慮一下。

編輯

看起來你再次的B開始活動A,當你退出乙 - 這不是實際需要。 Android會保留A的前一個實例,這就是爲什麼當你回去時看到A的另一個實例

+0

我已經使用你的想法來調用finish(),但我認爲這不是最好的方法來做到這一點,因爲我沒有正確地訂購後退堆棧,只是完成一項活動。 –

+0

噢..我想我現在已經看到了這個問題 - 當您再次從B啓動Activity A時,實際上是在創建一個活動A的新實例 - 這就是爲什麼您會在活動堆棧中看到A的另一個實例。看起來你正在重寫Activity B中的onBackPressed()(或可能的onDestroy())方法來啓動Activity A.那是正確的嗎?您不必啓動A的新實例 - Android會保留堆棧中Activity A的前一個實例。 – ucsunil

0

我使用FLAGS解決了問題。我認爲這是最優雅的方式。

public void openAActivity(){ Intent intent = new Intent(context,SpotsMapActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + Intent。FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); }