1. 程式人生 > >Activity#finish() 對其生命週期的影響

Activity#finish() 對其生命週期的影響

如果在 Activity#onCreate() 方法中呼叫 finish() 方法,其生命週期會發生什麼變化?

實驗環境:

  • compilesdksion=25.0.3;
  • com.android.support:appcompat-v7:25.3.1

無 Fragment 的情況

未呼叫 finish 方法

正常情況下 Activity 的生命週期:
Activity.onCreate -> Activity.onStart -> Activity.onPostCreate -> Activity.onResume -> Activity.onPostResume;

將 Activity 置於後臺後再返回到前臺:
Activity.onPause -> Activity.onStop -> Activity.onRestart -> Activity.onStart -> Activity.onResume -> Activity.onPostResume。

呼叫 finish 方法

在 Activity#onCreate() 中呼叫 finish() 方法,生命週期如下:
Activity.onCreate -> Activity.onDestroy。
如果未重寫 finish() 方法,從 finish() 方法返回後繼續執行 onCreate() 中剩餘的程式碼。

含有一個 Fragment

新增 Fragment 的方法:

 if (savedInstanceState != null) {
            FragmentManager fm = getSupportFragmentManager();
            myFragment = (MyFragment) fm.findFragmentByTag(MyFragment.TAG);
        }

        if (myFragment == null) {
            MyFragment = new MyFragment();
            FragmentTransaction ft
= getSupportFragmentManager().beginTransaction(); ft.add(android.R.id.content, myFragment, MyFragment.TAG); ft.commit(); } }

未呼叫 finish 方法

Activity.onCreate -> Fragment.onAttach -> Fragment.onCreate -> Fragment.onCreateView -> Fragment.onViewCreated -> Fragment.onActivityCreated -> Fragment.onStart -> Activity.onStart -> Activity.onPostCreate -> Activity.onResume -> Fragment.onResume -> Activity.onPostResume;

息屏後又點亮:
Fragment.onPause -> Activity.onPause -> Fragment.onStop -> Activity.onStop -> Activity.onRestart -> Fragment.onStart -> Activity.onStart -> Activity.onResume -> Fragment.onResume -> Activity.onPostResume;

關閉頁面:
Fragment.onPause -> Activity.onPause -> Fragment.onStop -> Activity.onStop -> Fragment.onDestroyView -> Fragment.onDestroy -> Fragment.onDetach -> Activity.onDestroy。

呼叫 Activity#finish() 方法

在 Activity#onCreate() 方法中呼叫 finish() 方法。
Activity.onCreate -> Fragment.onAttach -> Fragment.onCreate -> Fragment.onDestroy -> Fragment.onDetach -> Activity.onDestroy。

應用案例

如果 Activity#onCreate() 方法中有呼叫 finish() 方法情況,則要保持某些成員變數的健壯性,預防出現空指標等異常。比如:

public class MainActivity extends AppCompatActivity {
    private List<String> mData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

                mData = getIntent().getStringArrayListExtra("data");

        if (mData == null) {
            finish();
        }

        // more code
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();

        mData.clear();
    }
}

上述程式碼片段的邏輯是:如果上個頁面傳過來的資料為空,則關閉頁面。

問題在於,如果執行 finish() 方法,則會緊接著執行 Activity#onDestroy() ,則會出現空指標異常。如果該 Activity 中含有 Fragment,更要注意 Fragment#onDestroy() 方法中是否有可能發生空指標異常。

注意

使用 24 和 25 的 support 包,在Activity#onCreate() 中呼叫 Activity#finish() 後的表現不同,具體見下圖:

相關推薦

Activity#finish() 生命週期影響

如果在 Activity#onCreate() 方法中呼叫 finish() 方法,其生命週期會發生什麼變化? 實驗環境: compilesdksion=25.0.3; com.android.support:appcompat-v7:25.3.1

Vue生命週期鉤子函式的理解

對Vue生命週期鉤子函式的理解 例項建立之後,初始化事件和生命週期,而後觸發beforeCreate。beforeCreate,當前例項建立之前,很少操作,一般用於載入動畫,比如建立一個旋轉動畫。created表示當前例項建立完成,元件、屬性等初始化完成,一般封裝一個方法,從網路請求資料

兩個Activity切換時的生命週期

兩個Activity切換時的生命週期: 舊Activity記為ActivityOld,新Activity記為ActivityNew,從舊Activity開啟新Activity開始記錄: ActivityOld#onPause() ActivityNew#onCreate() Ac

Spring系列學習之Spring Cloud Skipper發現應用程式並管理生命週期

英文原文:https://cloud.spring.io/spring-cloud-skipper/ 目錄 Spring Cloud Skipper 概覽 特性 入門 歷史 釋出版本 相關專案 Spring Cloud Skipper Skipper是一種

Activity與Fragment的生命週期詳解

在安卓中Activity與Fragment是非常相似的兩個類,它們各自都擁有自己的生命週期,且都可以用來顯示佈局檔案中的檢視。其中Activity是通過setContenView()顯示檢視,而Fra

Android測試Activity和Fragment的生命週期

Activity的生命週期有7個函式,Fragment的生命週期有11個函式。 Activity生命週期除上述6個方法還有一個Restart()方法,該方法在該Activity從不可見(仍存在)到重新可見時呼叫。 測試程式碼如下: import android.a

Activity與Fragment的生命週期

一、Activity 生命週期 二、Fragment 生命週期 三、對比圖 四、測試程式碼 package com.goso.testapp; import android.app.Activity; import android.app.ListFragmen

Activity與Fragment 的生命週期對比

Fragment是3.0以後的東西,為了在低版本中使用Fragment就要用到android-support-v4.jar相容包,而FragmentActivity就是這個相容包裡面的,它提供了操作Fragment的一些方法,其功能跟3.0及以後的版本的Acti

Activity不同情況下生命週期

想要徹底弄清楚Activity在不同情況下的生命週期需要先掌握Activity的一些基礎知識 Activity完整的生命週期如下圖: 知道了Activity完整的生命週期之後還需要知道Activity的啟動模式。 Activity四種啟動模式:

原始碼分析LiveData根據生命週期自動處理資料

在官方文件中是這樣說的: LiveData是一個可觀察的資料持有者類。與常規observable不同的是LiveData可以關聯Activity,Fragment,Services的生命週期。保證了當在元件的生命週期的發生變化是LiveData會發生更新。 使用LiveData的優點有:

請詳細說下你vue生命週期的理解?

答:總共分為8個階段建立前/後,載入前/後,更新前/後,銷燬前/後。 建立前/後: 在beforeCreated階段,vue例項的掛載元素$el和**資料物件**data都為undefined,還未初始化。在created階段,vue例項的資料物件data有了

activity透明主題引起生命週期的變化

以前開發時,一直沒有留意activity如果主題背景透明,對生命週期有什麼影響呢? 測試方式:編寫demo 配置檔案(AndroidManifest)中 <?xml version="1.0" encoding="utf-8"?> <

Activity和Fragment的生命週期執行順序

總結一下Activity和Fragment的生命週期:  1.Activity和Fragment啟動時候的生命週期  1.Activity super.onCreate執行完畢.- Fragment

兩個Activity跳轉時 生命週期函式的變化

Activity 的生命週期: 生命週期函式呼叫時機 onCreate 在Activity物件被第一次建立時呼叫 onStart當Activity 變得可見是呼叫該函式 onResume當Activity開始準備與使用者互動時呼叫該方法 onPause當系

Vuejs之路之--例項生命週期的理解

用Vue框架,熟悉它的生命週期可以讓開發更好的進行。 首先先看看官網的圖,詳細的給出了vue的生命週期: 它可以總共分為8個階段: beforeCreate(建立前), created(建立後), beforeMount(載入前), mounted(載入後

淺談vue生命週期函式的理解

1.什麼是vue生命週期?有什麼作用? 每個 Vue 例項在被建立時都要經過一系列的初始化過程——例如,需要設定資料監聽、編譯模板、將例項掛載到 DOM 並在資料變化時更新 DOM 等。同時在這個過程中也會執行一些叫做 生命週期鉤子 的函式,這給了使用者在不同

Elasticsearch生命週期的思考

什麼是es索引的生命週期?有啥用?可以怎麼用?用了有什麼好處呢? 在現實的生產環境中有沒有覺得自己剛開始設計的索引的分片數剛剛好,但是隨著時間的增長,資料量增大,增長速度增大的情況下,你的es索引的設計是否還合理呢? 在現實的生產儲存中,有沒有一些資料時間長了就沒價值了,沒必要浪費儲存了,就可以刪除了,有些資

windowIsTranslucent屬性activity生命週期影響

<item name="android:windowIsTranslucent">true</item>:是否半透明 activity A跳轉到 activity B ,B的 windowIsTranslucent這個屬性設定為true後, A的生命週期 只能走到on

Activity生命週期以及launchMode生命週期影響

啟動Activity1,此時會建立一個Task,將Activity1新增到Task中。此時如果再啟動Activity1,由於Task頂部的Activity例項就是Activity1的例項,那麼不會重新建立Activity1的例項,而是會複用Task頂部的Activty1。如果此時啟動Activity2,由於T

Android windowIsTranslucent屬性Activity結束生命週期影響

在修改一個問題的時候是這個樣子的, 進入 某一個特定的介面(Activity) 然後按home鍵, 然後從最近任務列表中,點選進入這個activity。 然後再點選 back介面返回時, 其實是退出這個應用了,然後會閃屏一下,閃屏一下最近任務列表 這個