---
# System prepended metadata

title: Android生命週期

---

# Android生命週期
![](https://i.imgur.com/11JMuil.png)

## 在onResume()呼叫API物件

Error:
```
java.lang.IllegalStateException: calling this from your main thread can lead to deadlock
```
在寫主畫面時，第一時間必須輸出檔案，又要顯示recyclerView，導致進app時，同一時間onResume()和onCreate()裡的UI部分同時呼叫class可能造成死結，查了一下好像在拿GoogleAuthUtil的token時也很容易出現一樣的問題。

我的解法是將export函數使用new thread執行，剛進app讀取recyclerView時會慢個一秒顯示，但還是算快了。
```java=
private void exportSettings() {
        showLoading();
        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean apiResponse = KeyAPI.exportSettings(MainActivity.this);
                if (apiResponse == true) {
                    loadConfigs();
                } else {
                    Log.e(LOG_TAG, "Export failed.");
                }
            }
        }).start();
    }
```
還有在[stack overflow](https://stackoverflow.com/questions/17547019/calling-this-from-your-main-thread-can-lead-to-deadlock-and-or-anrs-while-getti)看到另一種解法是用AsyncTask，但考慮到exportSetting執行完才能執行下一個步驟，這個方法可能不太適合。

## 重新打開App會再做一次OnCreate()

後來又遇到生命週期的bug，每次暫時切換到別的App再開回來的時候，app又會做一次onCreate()，很奇怪，明明切別的App時候最後一步驟做的是OnPause()，照理來說必須做onDestroy()之後才會再重新OnCreate()。

查了一些資料之後才知道原來這是原生的bug，當你再次打開app時，手機不會從已開啟的app stack裡呼叫原本打開過的app，他會重新再從onCreate從頭跑一遍。

我的解法是在onCreate()開頭的地方加入判斷，如果已經開過app的話，destroy重新開啟的app，系統就會從已開啟app stack叫原本的app出來。

```java=
        if (!isTaskRoot()) {
            Log.d(TAG,"Elaucher is root.");
            finish();
            return;
        }
```