2014-07-06 123 views
13

對於Android,假設3個活動,a1 a2 a3,以及它們的點擊層次結構a1-> a2-> a3。Android,如何檢測該活動是否來自其他活動?

我的問題是在a2中,如何檢測它是從a3按下後退鍵而不是從a1進入?

+0

你的意思是如果你按下後退鍵在a2它會傳遞給你a3? – DavidBalas

+0

當從a1調用a2時,爲了表示它來自a1,添加一個額外元素。所以如果a2在a3的背部按鍵上達到,那麼這個額外的東西就不存在了。我沒有嘗試過,但理論上聽起來似乎合理。 – faizal

+0

[如何檢測是否從孩子活動回來?](https://stackoverflow.com/questions/7982081/how-to-detect-if-came-back-from-child-activity) –

回答

6

onCreate不會在背壓的情況下調用。

有多種方式可以推斷出您是否通過回推鍵抵達此活動。

  1. 集的OnCreate,上面寫着一個booleanonCreate被調用。

  2. 通過調用startActivityForResult開始C活動,當您從C onActivityResult返回時將被調用。

+3

可能重複認爲onCreate()從未被稱爲後壓的情況是不安全的。根據這些文檔,如果系統在系統已經因爲系統資源較低而處於停止狀態時在之前的活動中調用了onDestroy()時,它看起來會在後退的情況下調用onCreate。來源:https://developer.android.com/reference/android/app/Activity.html – Deemoe

+0

我相信這個接受的答案是不正確的(@ Deemoe的評論是正確的)。 – LarsH

+0

我同意。我的第二個選擇將工作。但是,在不區分背印和新推出的情況下,實現最終目標可能會有更好的方式。 –

3

當你開始你的活動時把一些關鍵的意圖。

Intent intent = new Intent(getBaseContext(), A1Activity.class); 
    intent.putExtra("I_CAME_FROM", "a1"); 
    startActivity(intent) 

而且在開業活動閱讀:

String flag = intent.getStringExtra("I_CAME_FROM"); 
    if(flag.equlas("a1")){ 
    //you came from a1 activity 
    } 

這將讓你瞭解你來自哪裏。

+0

這是一個不使用應用程序級標誌或startActivityForResult的好方法。你也可以在你的activity(a3)中重寫onBackPressed()函數來發送一個帶有額外指示intent.putExtra(「I_CAME_FROM」,「BackButton」)的intent。併發送給(a2)。 – Deemoe

3

您可以使用以下方法

onCreate()當第一次創建活動(從A1到A2)。當您通過按下後退按鈕返回時,此方法不會被調用。

onRestart()活動是在後臺,並來到前臺(背壓在A3)

+0

我想知道爲什麼沒有人會在這個帖子和另外一篇關於提示'onRestart()'的同一個問題上發帖。這似乎是一個很少被人注意的生命週期體育場。但這是唯一一種在回去之後肯定會被調用的方法。 – Opiatefuchs

+0

這些方法都不正確。當用戶按下後退按鈕,在進程被終止後(例如,用戶可能從任務列表中選擇了子活動)返回到其子活動時,可以調用onCreate()。當你從任何地方返回活動時,不僅通過按下子活動的後退按鈕,onRestart()會被調用。 – LarsH

8

您可以使用onActivityResult檢查來自另一個活動的回報。把你的A2活動中的代碼...

聲明請求代碼爲常數,在您的活動的頂部:

public static final int OPEN_NEW_ACTIVITY = 123456; 

將這個你開始新的活動:

Intent intent = new Intent(this, NewActivity.class); 
startActivityForResult(intent, OPEN_NEW_ACTIVITY); 

活動結束後做些事情。文檔建議您使用resultCode,但根據具體情況,按下按鈕時,結果可以是RESULT_OKRESULT_CANCELED。所以我會放棄它。

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == OPEN_NEW_ACTIVITY) { 
     // Execute your code on back here 
     // .... 
    } 
} 

由於某種原因,我在將它放入碎片時遇到了麻煩。所以你必須把它放在活動中。

您實際上不必在a3活動中放置任何代碼,但是如果您願意,您可以發回數據。

+0

我用它來檢測何時從設置活動回來。 – lenooh

相關問題