Android Activity自動重啟的問題

2021-07-22 23:09:08 字數 3193 閱讀 9591

1、於是第一反應就是是不是程式有什麼異常(空指標什麼的)導致,檢視日誌發現,任何error級別的日誌毛都沒有; 

2、由於該activity啟動時會繫結乙個遠端service,使用aidl進行通訊,於是想是不是由於那個遠端service崩潰導致的,再追蹤那個遠端service的程序,卻也沒有發現任何異常的日誌; 

3、繼續追蹤(有難度的bug,一方面能激起程式設計師的鬥志,當然也能讓程式設計師感覺無望崩潰),這次按照操作流程的**上下流程一步一步debug,然而當你仔細推敲自己**邏輯確實沒有問題但就是有這樣的現象的時候,慢慢就進入抓狂崩潰節奏的節奏。 

4、於是突然想到android系統在乙個程式有fatal型別的bug時會強制直接結束掉程式,於是又在一大堆log日誌裡搜尋fatal/force close之類的關鍵字,又在activitymanager 這個tag下看有沒有結束activity的資訊,以這些手段看能不能查出什麼端倪,仍然無果; 

5、腦海裡突然閃現過乙個想法,就是乙個activity在什麼情況下會使生命週期重走一遍呢?由於早前研究activity生命週期時碰過類似情形,答案即為當使用者按下電源、或者橫豎屏切換等條件下,如果當前activity在androidmanifest專案清單沒有寫上android:configchanges=」「屬性時,會使得當前activity重繪,即先destroy掉然後重啟,心中暗喜,但是不是這樣引起的呢?且等,我的那個activity雖然沒有寫android:configchanges屬性,但是我並沒有按電源鍵,更沒有橫豎螢幕切換(因為我定了螢幕方向為android:screenorientation=」portrait」),也沒有軟鍵盤的隱藏與展示,那麼究竟是什麼鬼導致的configchanges呢??抓狂!! 

真相大白:

既然已經想到是由於configchanges導致的activity重繪,那麼就往這方面去想還有什麼會導致configchanges,於是這次機靈一點,再次從整個手機系統的log入手,輸入關鍵字「change」,在過濾同的log日誌中仔細找找有什麼change了,(其實這裡笨了,因為既然知道了寫上android:configchanges屬性就不會導致activity重繪,那麼直接去那裡查屬性值就好了),結果在日誌中檢視到「simstatuschangereceiver」,好吧,大概意思就是說sim卡狀態變化了,在此就解釋在操作那個按鈕幹了什麼事,因為專案比較特殊能改變sim卡的禁用與啟用狀態,然後再在android:configchanges=」xx|xx」,屬性值裡檢視,還真有「mcc「、」mnc」兩值,把這個寫上吧,即 android:screenorientation=」portrait」 

android:configchanges=」mcc|mnc」 (意思即為匹配sim卡中的狀態變化),最後問題解決。

**總結:**1、碰到該問題時沒有第一時間想到activity自動重啟是由於configchange引起的; 

2、以前並不知道原來sim卡的狀態變化也是configchanges的一種,且會讓沒有寫configchanges屬性的activity重啟,sim變化的觸發情況倒是有:1)、手機中的sim卡在某種情況下突然失效;2)、使用者熱撥插sim卡(一些手機的sim卡槽在手機右側抽屜式);3、軟體行為等。 

3、就算activity重啟,也需要作好一些狀態的儲存,然後在oncreate()生命週期方法中再提取出來 

另configchanges=」「還有一些其他值選項,大家可以去參考研究一下。

最後:除錯乙個bug,寫了那麼多廢話,讓各位眼睛受累了,在此筆者只是記錄一下這個比較詭異bug讓我在debug它時抓狂的過程以及解決了它後,志之以共勉。

有時候我們希望讓乙個程式的介面始終保持在乙個方向,不隨手機方向旋轉而變化:

在androidmanifest.xml的每乙個需要禁止轉向的activity配置中加入android:screenorientation=」landscape」 屬性。

landscape = 橫向

portrait = 縱向

android中每次螢幕方向切換時都會重啟activity,所以應該在activity銷毀前儲存當前活動的狀態,在activity再次 create的時候載入配置,那樣,進行中的遊戲就不會自動重啟了!

要避免在轉屏時重啟activity,可以通過在androidmanifest.xml檔案中重新定義方向(給每個activity加上 android:configchanges=」keyboardhidden|orientation」屬性)。

在需要控制螢幕顯示方向的activity中重寫 onconfigurationchanged(configuration newconfig)方法,這樣在轉屏時就不會重啟activity了。

if(newconfig.orientation==configuration.orientation_landscape)  

else

<

activity

android:name

android:label

android:screenorientation

="landscape"

android:configchanges

="orientation"

>

<

intent-filter

>

<

action

android:name

="android.intent.action.view"

/>

<

category

android:name

="android.intent.category.default"

/>

intent-filter

>

activity

>

android:screenorientation=」landscape」

android:configchanges=」keyboardhidden|orientation」

@override

public

void

onconfigurationchanged(configuration newconfig)

else

}

在模擬器中可以按 ctl+f11 模擬做螢幕旋轉。

參考:

how to disable screen auto-rotation on android

如何在 android 程式中禁止螢幕旋轉和重啟activity

android activity啟動模式

1.標準模式 standrad 沒啟動乙個activity,都會建立乙個activity例項,放入回退棧的內部 2.單頂模式 singletop 當啟動launchmode是 singletop的時候,系統會先判斷棧頂是不是要啟動的那個activity例項,如果是,則不會建立新的例項,直接讓棧頂直接...

Android Activity啟動模式

在androidmanifest.xml中配置 android name mainactivity android launchmode standard 有以下四種 standard 預設模式,每次通過intent啟動activity時都會建立乙個新的activity例項,並放入任務棧中。sing...

android Activity切換動畫

今天準備比賽的時候 遇到了這個問題。查了些資料總結了下。主要是通過 android theme 標籤來實現 android theme style 那麼就需要自己寫style風格檔案 如下 這裡之所以寫成2style個是為了解耦然後自己寫下anim anim enter anim anim exit...