簡體   English   中英

Android有時會強制殺死應用程序

[英]Android sometimes force kills application

我開始活動 A,然后開始活動 B。
我按下主頁按鈕,然后等待很長時間。
當我恢復應用程序時,它強制停止。

02-03 18:42:54.413 828-844/system_process I/ActivityManager: Force stopping ru.tabor.search appid=10089 user=0: from pid 20405
02-03 18:42:54.414 828-844/system_process I/ActivityManager: Killing 30212:ru.tabor.search/u0a89 (adj 7): stop ru.tabor.search
02-03 18:42:54.445 828-5948/system_process I/WindowState: WIN DEATH: Window{18b92c9b u0 ru.tabor.search/ru.tabor.search.modules.authorization.AuthorizationActivity}
02-03 18:42:54.447 828-845/system_process I/WindowState: WIN DEATH: Window{1cd0cfe4 u0 ru.tabor.search/ru.tabor.search.modules.registration.RegistrationActivity}
02-03 18:42:54.519 828-844/system_process I/ActivityManager:   Force finishing activity 3 ActivityRecord{25a8977f u0 ru.tabor.search/.modules.authorization.AuthorizationActivity t2593}
02-03 18:42:54.520 828-844/system_process I/ActivityManager:   Force finishing activity 3 ActivityRecord{d516838 u0 ru.tabor.search/.modules.registration.RegistrationActivity t2593}
02-03 18:42:54.523 828-20666/system_process W/ActivityManager: Spurious death for ProcessRecord{21ff313b 0:ru.tabor.search/u0a89}, curProc for 30212: null
02-03 18:42:59.890 828-1247/system_process I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10100000 cmp=ru.tabor.search/.modules.authorization.AuthorizationActivity} from uid 10089 on display 0
02-03 18:42:59.903 828-1247/system_process V/WindowManager: addAppToken: AppWindowToken{1c4987a0 token=Token{279a08a3 ActivityRecord{9f5afd2 u0 ru.tabor.search/.modules.authorization.AuthorizationActivity t2593}}} to stack=1 task=2593 at 0
02-03 18:42:59.919 828-891/system_process V/WindowManager: Adding window Window{1735e91b u0 Starting ru.tabor.search} at 4 of 8 (after Window{2ab6bf53 u0 com.cleanmaster.mguard/com.keniu.security.main.MainActivity})
02-03 18:43:19.288 828-1673/system_process I/ActivityManager: Start proc 21366:ru.tabor.search/u0a89 for activity ru.tabor.search/.modules.authorization.AuthorizationActivity

如何解決?

據我所知,你對此無能為力! 這就是android垃圾收集系統的行為!

我記得,android 自己做垃圾收集,如果你在后台很長時間不使用活動,它會被系統收集垃圾,以便為其他應用程序和進程騰出內存。

如果您想保留該活動中的任何信息,請將其保存在這里;

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
}

當你回到那個活動時,

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(savedInstanceState!=null){
    // GET #savedInstanceState AND USE THE OBJECT YOU STORED
    }
}

這就是你所能做的。

您是否將某些內容作為 Intent extra 傳遞給活動? 如果沒有,請嘗試從您的設備中刪除干凈的主。

你的應用程序泄漏了嗎? 如果手機內存不足,它將殺死內存豬應用程序。 如果有一個進程在這些活動上運行,則將其轉移到服務並在 oncreate 中調用 startForeground()。

重新創建一個活動說:

如果您的活動當前已停止並且長時間未使用,或者前台活動需要更多資源,系統也可能會破壞您的活動,因此系統必須關閉后台進程以恢復內存。

所以你不能阻止系統殺死你的應用程序。

要克服它,您應該重寫onRestoreInstanceState方法。 在這種情況下,您可以在系統終止活動時保存活動狀態,然后在導航回此活動時恢復。

另一種選擇是實現自己的IntentService

引用服務API 指南:

Android 系統僅在內存不足時才會強制停止服務,並且必須為具有用戶焦點的活動恢復系統資源。

顯然 Android 內存是有限的,因此虛擬機可以刪除任何可能不必要的代碼。

查看Activity 生命周期方法,特別是onResume並確保您完全理解這一點。 很多時候應用程序崩潰只是因為不正確使用 Activity 生命周期的方法。

另一個重要的部分是 Activity 的設計考慮因素是,無論持久性數據發生了什么,您的 Activity 都應該使用一些默認值顯示其 UI。 所以假設是這樣的,如果我有數據我會顯示,如果我沒有,我真的不在乎 無論有無數據,您的 UI 都不應崩潰 您可以使用Resources ,例如String.xmldimens.xml來存儲一些默認值,甚至在布局中。

如果您仍然想使用單例類,這很好,但請確保每次嘗試訪問單例時都進行以下檢查。

if (instance==null)
    instance=CurrentActivity.getInstance()

getInstance()方法不僅返回您當前的實例,它還將確保

  • 它初始化所有對象和變量
  • 其他單例方法作為實例方法

不要靜態地從一個活動訪問數據到另一個活動。 對於您現在面臨的類型問題,這對 android 來說並不好,而且它也不是很好的 OOP 編程實踐。

我推薦SharedPreference 持久化數據的更好方法,如果滿足您的要求,那就去吧。

如果您想從不同的 Android 組件(如 Activity、Service 或 BroadcastReciever)傳遞數據,您可以將其放入包中並作為意圖發送。 而且,它們一如既往地是 SQLLite 數據存儲、文件 IO 等。

希望這會幫助你。

很可能您的應用程序由於內存過載而被 android OS 殺死,或者可能存在某種情況下您的主線程中正在運行某種進程,您需要對其進行檢查。同時覆蓋 OnResume 函數並檢查您得到的結果。

我知道這個問題已經很老了,但是對於那些仍在尋找答案的人,請嘗試從 Android 設置中為您的特定應用關閉電池優化和打盹模式。 這應該有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM