2011-09-24 23 views
0

我都在解釋如何使用生命週期的工作糟糕透頂的書籍,還有很多我的思念,我很希望有人可以填寫。如何處理活動即將再次前景

我的應用程序結構當它剛開始的時候,它開始了一個充滿法律可言的活動,用戶必須接受。當他說「OK」,我開始我的主要活動,然後我把完成這樣的:

public void onClick(View view) { //as a result of "I accept" 
    Intent mainIntent = new Intent(mParent, EtMain.class); 
    startActivity(mainIntent); // Start the main program 
    finish(); 
} 

然後在EtMain在onCreate方法,我有一些標籤和我實例化一些類:

super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
SetupTabs.setMyTabs(mTabHost, this); 

mComData = new ComFields(this); // Create the objects 
mDepWx = new WxFields(this, DepArr.Departure); 
mArrWx = new WxFields(this, DepArr.Arrival); 
mDepVs = new DepFields(this); 
mArrVs = new ArrFields(this); 
mTabHost.setOnTabChangedListener(new OnTabChangeListener(){ 
} 

問題: 第一個片段中的「完成」應終止legalbabble活動,因此它永遠不會重新啓動,對吧?即使我的應用被推到背景中,EtMain也將永遠存在(直到外部死亡),對吧?

現在的方式是,當EtMain被推動並隨後進入前臺(通過點擊圖標),它會經過legalbabble屏幕,就好像它是一個完整的開始 - 這就是我想要阻止的 - 再次通過legalbabble屏幕。

這似乎是我想重寫onRestart在第二個代碼片段,並在那裏重新啓動應用程序,對吧?這是我不清楚的部分。

我的問題是onRestart需要做什麼。我是否必須重新創建選項卡中的所有選項卡和數據以及所有對象實例?或者是應用程序的內存狀態保存在某個位置,然後恢復到其他位置被置於前臺的狀態,在這種情況下沒有太多需要完成的操作,因爲所有對象和偵聽器都仍然存在?

+0

請參閱勞倫斯道森的第一點。還搜索關於「首次運行」代碼的問題。您可以使用SharedPreferences檢查'首次運行'場景,並且如果條目不存在,則您的代碼將返回false。一旦你完成了合法的喋喋不休,只要寫一些'SharedPreferences',它就不會再顯示(除非用戶卸載/重新安裝)。這是相當直接的東西。 – Squonk

回答

1

我認爲問題在於清單中的啓動活動是legalbabble活動,因此當您單擊該圖標時,系統會啓動另一個活動。更好的架構是使用startActivityForResult在EtMain活動的onCreate方法中啓動legalbabble活動。從文檔:

作爲一個特殊的情況下,如果你打電話startActivityForResult()與活動的初始onCreate(Bundle savedInstanceState)/onResume()期間requestCode> = 0,那麼將不會顯示你的窗口,直到結果從返回開始活動。

當你得到的結果在onActivityResult,你可以調用finish()如果法律的東西,但被拒絕;否則一切都會正常進行。

這樣可以避免在接受合法內容時清單中定義的啓動活動結束的問題。

+0

感謝所有回答的人。我認爲這個答案是最有幫助的,只有一個選擇是很困難的 - 而且我會在幾天之內回來旅行時嘗試。 –

2
  1. 是在第一次活動結束後,您不應該再次查看該活動。您也可以寫信給用戶以前看過法律信息的shared preferences

  2. 如果你的UI對象的創建是在onCreate方法中,這隻能被調用一次。暫停或恢復不會再次調用onCreate方法。

  3. 除非您在onPause方法中顯式刪除對象和tabChangedListeners,否則您不必在onRestart方法中觸碰它們。

  4. 正確,應用程序的狀態會自動保存。您不必觸摸onRestart方法。

希望這有助於!

+0

感謝您的提示,尤其是我不需要對onRestart做任何事情,事情就應該重新開始。我認爲關鍵是我不應該將合法可能作爲最初的活動。 –

1

EtMain不會永久保留,如果用戶退出(通過按BACK鍵)活動將完成(onPause,然後onStop,然後onDestroy將被調用)。 一般來說,你可以忽略onRestore,直到你做一些複雜的事情。

一旦用戶退出應用程序並重新進入(或在主屏幕上按下圖標),onCreate(隨後是onStart和onResume)將被調用您的第一個活動,因此您不需要onRestart中的任何邏輯,您在onCreate中的代碼將會像第一次那樣爲您進行設置。因此,當用戶在退出後啓動應用程序時,除非存儲首選項(在SharedPreferences或數據庫或文件中)以表明您已經顯示它 - 在這種情況下立即完成並啓動主活動。

onRestart僅在應用程序從停止狀態(onStop已被調用但不是onDestroy)變爲啓動狀態(onStart被調用,但onResume尚未)時才被調用。

對於保存數據 - 某些組件自動保存它們的狀態(例如EditTexts記住它們中的文本,TabHosts記住當前選定的選項卡等)。有些組件不會。如果你想保存額外的數據,然後使用onSaveInstanceState和onRestoreInstanceState。您應該只使用這些方法來恢復應用程序的狀態或臨時數據,而不是重要的事情,例如用戶正在查看的資源ID,他們的縮放級別等。對於聯繫人或實際數據等事情,應在調用onPause時將這些更改提交到數據庫,SharedPreferences或其他永久性存儲(例如文件)。

如果您感到困惑,我建議您查看Android Activity lifecycle。或者提出更多問題!

+0

謝謝你的背景資料,我會仔細考慮它以更好地理解發生了什麼。謝謝你讓我知道我可能不需要對onRestart做任何事情。 –

相關問題