2013-07-17 56 views
0

我從另一位員工「繼承」了一個應用程序,現在我必須進行一些修改。由於某種原因,每當我開始一項活動時,前一項就停止而不是暫停。我曾看過THIS answer,但我的應用程序是條形碼掃描儀應用程序(使用相機),但沒有其他相似之處。我正在啓動器活動和其他非相機相關活動之間移動,啓動器活動正在停止。這不是由於android:launchMode="singleTask",因爲我從清單中評論了該行。爲什麼我的活動停止了?

需要暫停啓動器活動而不是停止啓動器活動的原因是我打算實現一個公共靜態ArrayList,我將從其中添加其他活動的對象。

有沒有人有任何想法,爲什麼發生這種情況?這讓我瘋狂。

+2

*是我打算實現一個公共靜態ArrayList,我將添加其他活動的對象。* - 您不應該這樣做。 – Luksprog

+0

你不能依賴一個沒有被銷燬的Activity。您應該仔細閱讀活動生命週期和代碼。正如Luksprog所說,你的計劃是一個非常糟糕的主意。 – Simon

+0

我想這樣做的原因是我將添加到公共靜態ArrayList的對象來自遞歸活動的不同實例。不知道如何將它們收集到一個地方。在任何情況下,始終停止發射器的活動都是異常的。 – Sebek

回答

0

我認爲您的活動因高內存使用率(相機,條碼掃描,分析掃描圖像等)而死亡。

您可以擴展Application類並在擴展Application類中實現公共靜態ArrayList。您可以找到很多示例如何擴展Application類。

+0

幾乎沒有內存使用情況。我使用簡單的啓動器活動啓動應用程序,然後按註釋並使用edittext字段和完成按鈕打開另一個活動,在該實例中,啓動器活動停止。 – Sebek

+0

你如何開始第二個活動等在這裏粘貼一些代碼。 – g00dy

+0

這很奇怪,我以爲你開始條碼掃描活動......無論如何擴展Application類並放在那裏ArrayList將解決你的非持久性數據存儲問題。 – Alex

0

documentation

protected void onPause() 

古稱當活動進入後臺活動的生命週期的一部分,但還沒有(還)被殺害。與onResume()的對應部分。

當活動B在活動A前面啓動時,此回調將在A上被調用。只有在A的​​onPause()返回時纔會創建B,因此請確保在此處不做任何冗長的操作。

此回調函數主要用於保存活動正在編輯的任何持久狀態,以便向用戶呈現「就地編輯」模型,並確保沒有足夠的資源來啓動沒有第一個活動的新活動時不會丟失任何內容殺死這一個。這也是一個很好的地方,可以停止動畫和其他消耗大量CPU的內容,以便儘快切換到下一個活動,或者關閉像攝像機這樣的獨佔訪問資源。

在系統需要更多內存的情況下,它可能會終止暫停的進程以回收資源。因此,您應該確保在您從此函數返回時保存所有狀態。在一般的onSaveInstanceState(捆綁)用於每個實例的狀態保存在活動中,該方法被用來存儲全局持久性數據(以內容提供商,文件等)

收到這個電話後,您通常會接收到onStop()的下一個調用(在下一個活動恢復並顯示之後),但是在某些情況下,會直接調用onResume()而不經過停止狀態。

派生類必須調用超類的這個方法的實現。如果他們不這樣做,就會拋出異常。

1

請記住,在低內存條件下,有報道稱Android操作系統會直接卸載表示您活動的類。這意味着該類中的任何靜態變量都將從內存中移除。下次您有Activity的實例時,靜態變量不會爲空,但它將爲空。我有類似的問題單身人士在一段時間後消失(問題實際上是不負責任的內存使用,但仍然 - 不依賴於靜態對象來保存數據)

只是序列化您的對象,並堅持它們,或序列化部分的數據,並在需要時使用它們來創建新的對象。

1

這是正常的行爲。僅當活動可見時(即顯示對話框或具有透明背景的其他活動)時,活動纔會暫停。相反,當您啓動一個新的活動時,如果前一個活動不再可見,它將進入停止狀態。這是最常見的行爲!

如果您需要運行後臺服務,即持續跨不同活動的內容,則應使用Service