2011-07-22 66 views
15

當按下BACK鍵時,現在活動被破壞。我怎樣才能使它停止(即保持所有變量等),而不是被破壞?如何使活動從BACK鍵停止,而不是被銷燬?

謝謝!

+0

的http:// stackoverflow.com/questions/3141996/android-how-to-override-the-back-button-so-it-doesnt-finish-my-activity –

+0

類似,但它在後退鍵按下時運行主要活動。我只需要停下來(即暫停並移動到背景,從而返回到之前的活動)。 – Roger

+0

什麼/多少變數?他們如何被使用?您可以考慮將它們設置爲類變量,而不用擔心使活動保持活動狀態。 – Rob

回答

13

爲什麼你需要保持變量存活?考慮到Android應用程序的建立生命週期,我不確定阻止活動被破壞「僅僅爲了保持變量」是合理的。

  1. 即使您在不破壞應用程序的情況下停止應用程序,Android始終有可能殺死它以釋放內存。無論如何,您必須在代碼中對此進行解釋,因此防止應用程序被破壞並不會使您無法編寫代碼。

  2. 使用onPause()和onResume()方法中的SharedPreferences,可以相對容易和快速地保存和恢復變量。除非您存儲大量數據,否則防止應用程序被破壞可能沒有多大區別。

  3. 這聽起來像你想保留變量在內存中,因爲你打算返回到這個活動。通常情況下,您不會使用後退按鈕來遠離您想要返回的活動。相反,您會創建一個意圖並開始一個新的活動。當你這樣做時,Android將當前活動放在Back Stack上,調用onPause()和onStop(),這看起來就像你正在尋找的行爲。

所以,如果你還真想防止被破壞(至少要等到Android的決定是使用過多內存,並殺死它在它自己),你總是可以使用薩格爾的代碼,並在啓動一個新的活動你的活動onBackPressed()。

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

只要確定那是你真正想要做的。

+0

謝謝,作品...只是一個細節,我應該如何讓它知道哪個活動開始了這個活動,以便它知道要返回哪個活動? – Roger

+1

如果您只想返回到上一個活動,那麼爲什麼後退按鈕的正常功能不可接受?您可以通過在用於使用intent.putExtra(「activity_name」,「activity_1」)開始第二個活動的Intent中包含有關它的信息,然後在第二個活動中檢索該名稱來確定第一個活動。但是,除非你在做一些非常不尋常的事情,否則你的興趣可以通過在onPause()和onResume()中正確保存你的數據,而不必重寫onBackPressed()來獲得。 – theisenp

+0

+1進行詳細深入的迴應! –

1

這與之前詢問的this question類似。

希望這會有所幫助! N.S.

+2

關閉,但「moveTaskToBack(true);」停止整個應用程序(即充當「家」按鈕),而我只需要停止一個活動。 – Roger

5

按BACK鍵觸發Activity類的onBackPressed回調方法。此回調的默認實現調用finish()方法。

http://developer.android.com/reference/android/app/Activity.html#onBackPressed()

您可以覆蓋此方法來移動活動背景(模擬天生按HOME鍵的作用

如:


@Override 
public void onBackPressed() { 
    onKeyDown(KeyEvent.KEYCODE_HOME);   
} 

你也可以改爲考慮moveTaskToBackground()提到這裏:

Override back button to act like home button

+0

不,不,只需要停止一個活動,而不是整個應用程序。 :) – Roger

+0

我相信如果你停止一個活動,你會失去它的上下文和所有它的本地變量。這捍衛你想要達到的目標。糾正我,如果我錯了。 –

+0

不是真的,如果我覆蓋後退按鈕以像home按鈕一樣操作,則當我再次啓動應用程序時,內容仍然存在。問題是它停止了整個應用程序,而我只需要停止一個活動。 :) – Roger

0

首先,抱歉沒有回答問題,原因,我仍然沒有最佳答案。 但是,當人們開始問「你需要什麼」時,我真的很喜歡。而且,很少有人問這個問題,確實值得這樣的問題。我覺得沒有這個時間,但沒關係,這不是問題......

無論如何,我會嘗試指出爲什麼我們有些人深信,

從活動A到活動B(創建UI基於一些數據提取)和從B返回到A(銷燬所有創建的UI和/或B中獲取的數據)有時是一個壞概念。更好的解決方案是將堆棧保持原樣,因此在Activity B中使用finish(),但將Activity B保持爲Pause狀態,以便稍後再次從Activity A調用它時 - 它只會在onResume =沒有重新創建在UI中,不需要額外的數據提取。當然,獎金是一個快速響應的用戶界面,如果你有更復雜的用戶界面佈局,這種差異是真的。

10

簡單的一行

@Override 
public void onBackPressed() { 
    mActivity.moveTaskToBack(true); 
} 
+0

真棒。剛剛解決了我的問題,一行 – Jigar

+0

最好的答案,解決了一行中的問題。 –

1

我設法找出你想要什麼: 2個活動之間切換使用後退按鈕並保持所有不被摧毀!

例如:你有2個活動& B. A將首先啓動,然後在裝入B調用B.,用戶按下返回鍵和切換回從B.活動距離現在B應該在不會被破壞,只是進入背景,當用戶再次從A開始活動B時,活動B將被帶到前臺,而不是被重新創建或創建新的實例!

如何實現這一點:

1.覆蓋onBackPressed()活動B的:

@Override 
public void onBackPressed() { 
    Intent backIntent = new Intent(this, ActivityA.class); 
    backIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    startActivity(backIntent); 
} 

2.在活動A,呼叫活動B:

public void callActivityB() { 
    Intent toBintent = new Intent(this, ActivityB.class); 
    toBIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    startActivity(toBintent); 
} 

記得要加標誌:Intent.FLAG_ACTIVITY_REORDER_TO_FRONT當您致電A & B.

-2

只需在活動清單中指定爲

android:persistent="true" 

這應該可以防止你的活動被破壞。爲了更多地瞭解這個請參考這是由我回答了這些鏈接如下

How to prevent call of onDestroy() after onPause()?

Prevent activity from being destroyed as long as possible

在上面的帖子我已經詳細的使用情況說明

+1

該屬性不存在以下活動:https://developer.android.com/guide/topics/manifest/activity-element.html – jekatt

+0

@jekatt它確實存在https://developer.android.com/guide/topics/ manifest/application-element.html –

+0

@ aravind.udayashankara此屬性用於'',如您在參考的文檔中所述。 也在這個文檔中 https://developer.android.com/guide/topics/manifest/activity-element.html 關於'''android:persistent'屬性不存在 –

相關問題