• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 安卓活動的生命周期

    標簽: Android

    安卓每個活動在其生命周期中最多可能有四種狀態:

    1. 運行狀態:
              當一個活位于返回棧頂時這時于運行狀態。
    2. 暫停狀態:
              當一個活不再棧頂位置,但仍然可見時這時入了停狀。你可能會覺得既然活動不在棧頂了,會可呢?是因并不是一個活都會占滿整個 屏幕的,比如對話框形式的活只會占用屏幕中間的部分區域。?????
    3. 停止狀態:
              當一個活不再棧頂位置,并且完全不可候,就入了停止狀。系仍然會為這種活保存相的狀和成員變量,但是并不是完全可靠的,當其他地方需要內存時,于停止狀的活有可能會被系回收。 
    4. 銷毀狀態:
               當一個活從返回中移除后就成了銷毀。系會最向于回收這種的活動,從而保手機的內存充足。 

     Activity中定7個回調方法,覆蓋了活生命周期的一個環節:

     

    • onCreate() 個活中我都會重寫個方法,它會在活第一次被建的調用。個方法中完成活的初始化操作,比如布局、定事件等。
    • onStart() 個方法在活由不可見變為調用。
    • onResume() 。這個方法在活動準備好和用戶進行交互的時候調用。此時的活動一定位于返回棧頂,并且于運行狀
    • onPause() 。這個方法在系統準備去啟動或者恢復另一個活動的時候調用。我們通常會在個方法中將一些消耗CPU放掉,以及保存一些關鍵數據,但個方法的行速度一定要快,不然會影響到新的棧頂的使用。
    • onStop() 。這個方法在活動完全不可見的時候調用。它和onPause() 方法的主要區別在于,如果啟的新活是一個對話框式的活,那onPause() 方法會得到行,onStop() 方法并不會執行。
    • onDestroy() 個方法在活銷毀之前調用,之后活的狀變為銷毀態。
    • onRestart() 個方法在活由停止狀態變為運行狀之前調用,也就是活被重新了。
    以上7個方法中除了onRestart() 方法,其他都是兩兩相的,從而又可以將活3生存期。
    • 完整生存期 。活onCreate() 方法和onDestroy() 方法之經歷的,就是完整生存期。一般情況下,一個活會在onCreate() 方法中完成各初始化操作,而onDestroy() 方法中完成放內存的操作。
    • 生存期 。活onStart() 方法和onStop() 方法之經歷的,就是可生存期。在可生存期內,活動對于用戶總是可的,即便有可能無法和用戶進行交互。我可以通過這兩個方法,合理地管理那些源。比如在onStart() 方法中對資行加,而在onStop() 方法中對資放,從而保證處于停止狀的活不會占用多內存。
    • 前臺生存期 。活onResume() 方法和onPause() 方法之經歷的就是前臺生存期。在前臺生存期內,活動總于運行狀的,此的活是可以和用戶進行交互的,看到和接觸最多的也就是個狀下的活

     

    實踐項目:

    主活動布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/start_normal_activity"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Start NormalActivity"
            android:onClick="startNormalActivity"/>
    
        <Button
            android:id="@+id/start_dialog_activity"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Start DialogActivity"
            android:onClick="startDialogActivity"/>
    </LinearLayout>

     子活動NormalActivity布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="This is a normal activity" />
    </LinearLayout>

    子活動DialogActivity布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="This is a dialog activity" />
    </LinearLayout>

    AndroidManifest.xml內容:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.activitylifecycletest">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity
                android:name=".DialogActivity"
                android:theme="@style/Theme.AppCompat.Dialog">
            </activity>
            <activity android:name=".NormalActivity" />
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    兩個子活動的代碼不需要再重新編寫,用自動生成的即可:

    public class NormalActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.normal_activity);
        }
    }
    public class DialogActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.dialog_activity);
        }
    }

    主活動代碼:

    public class MainActivity extends AppCompatActivity {
    
        public static final String TAG = "MainActivity";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "+++++++++++++++++++++++++");
            Log.d(TAG,"onCreate:這個方法中完成活動的初始化操作");
            setContentView(R.layout.activity_main);
    
        }
    
        public void startNormalActivity(View v){
            Intent intent = new Intent(MainActivity.this,NormalActivity.class);
            startActivity(intent);
        }
    
        public void startDialogActivity(View v){
            Intent intent = new Intent(MainActivity.this,DialogActivity.class);
            startActivity(intent);
        }
    
        //onStart() 活動由不可見變為可見
        @Override
        protected void onStart() {
            super.onStart();
            Log.d(TAG, "onStart:活動由不可見變為可見");
        }
    
        //這個方法在活動準備好和用戶進行交互的時候調用。此時的活動一定位于 返回棧的棧頂,并且處于運行狀態
        @Override
        protected void onResume() {
            super.onResume();
            Log.d(TAG, "onResume:這個方法在活動準備好和用戶進行交互的時候調用。此時的活動一定位于 返回棧的棧頂,并且處于運行狀態");
    
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d(TAG, "onPause: 這個方法在系統準備去啟動或者恢復另一個活動的時候調用。");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d(TAG, "onStop: 這個方法在活動完全不可見的時候調用。");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "onDestroy: 這個方法在活動被銷毀之前調用,之后活動的狀態將變為銷毀狀態。");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.d(TAG, "onRestart: 這個方法在活動由停止狀態變為運行狀態之前調用,也就是活動被重新" +
                    "啟動了。");
        }
    }

    首次運行之后虛擬機界面:

    此時我們用篩選器查看TAG即MainActivity標簽的內容為:
     

    可以看到,當MainActivity第一次被會依次onCreate() onStart() 和 onResume() 方法。 

    當我們點擊第一個按鈕startNormalActivity后,虛擬機的界面為:

    此時再查看日志發現又執行了onPause() onStop() 方法

     由于NormalActivityMainActivity完全遮住,因此onPause() onStop() 方法都會得到執行。

    然后我們再按下back鍵返回MainActivity,此時我們再查看日志發現onRestart() 方法會得到行,之后又會依次執onStart() onResume() 方法。

    接著再點第二個按鈕startDialogActivity,此時虛擬機的界面為:

    這時活動就處于暫停狀態,可以通過打印的日志看到,只有onPause() 方法得到了行,onStop() 方法并沒有行,是因為DialogActivity并沒有完全遮MainActivity,此MainActivity只是入了停狀,并沒有進入停止狀態

    再按一下back鍵,此時只有onResume() 方法會得到行:

    再按一下back鍵退出程序,程序會依次會onPause() onStop() onDestroy() 方法,最終銷毀MainActivity

    這就是一個完整的生命周期。

                                                                                             ——本文摘自《第一行代碼》(第2版)為了方便自己理解稍微做了一些改動。如果想看原文,請看《第一行代碼》(第2版)P88——P98

    版權聲明:本文為qq_41575507原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_41575507/article/details/105477836

    智能推薦

    安卓學習筆記----淺析安卓生命周期

    1. 簡述 安卓的生命周期有六個,分別為:onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy(),每一個Activity都有這些生命周期,通過這些生命周期,Activity在不存在,停止,暫停和運行之間轉換,如下圖: 2. 通過打印日志信息更深了解生命周期 如果對安卓Logcat工具或是日志打印不了解,請戳此鏈接 用到...

    2.4活動的生命周期

    2.4.2活動狀態 每個活動的生命周期中最對會有4種狀態 1.運行狀態 當一個活動位于返回棧的棧頂時,活動就處于運行狀態 2.暫停狀態 當一個活動不再處于棧頂位置,但是還是可見,這個活動就出于暫停狀態,有的活動并不會占滿屏幕,所以會有這種情況,,暫停的活動依然是完全存活的 3.停止狀態 既不處于棧頂,又完全不可見,就處于停止狀態,系統仍會保持這種活動相應的狀態和 成員變量,但并不可靠,系統需要內存...

    Android Activity 活動的生命周期

      生命周期 Activity 類中定義了7 個回調方法,覆蓋了活動生命周期的每一個環節。以下7 個方法中除了onRestart()方法,其他都是兩兩相對的。 onCreate()。這每個活動中我們都重寫了這個方法,它會在活動第一次被創建的時候調用。你應該在這個方法中完成活動的初始化操作,比如說加載布局、綁定事件等。 onStart()。這個方法在活動由不可見變為可見的時候調用,對資源進...

    體驗活動的生命周期

    我們通過實例來體驗一下活動的生命周期,使用一下Android的7大回調方法。 我們建立一個主活動MainActivity 再建立兩個子活動 NormalActivity 和 DialogActivity。 接下來編輯兩個子活動的layout文件,都添加一個TextView控件,只不過兩個顯示的內容不同。 可以看出來兩個活動基本一樣,接下來的操作會將其分成一個普通的活動,另外一個變為對話框式的活動。...

    Activity----活動的生命周期

    返回棧 Androif的活動是可以層疊的,每啟動一個新的活動,就會覆蓋到原活動之上,然后點擊Back鍵會銷毀最上面的活動,下面的活動就會重新顯示出來。他是使用任務(Task)來管理活動的,一個任務就是一組存放在棧里的活動的集合,這個棧也被稱為返回棧,每當啟動一個活動,他會在返回棧中入棧,處于棧頂位置,當按下Back鍵或者調用finish()方法去銷毀一個活動時,處于棧頂的活動會出棧,這時前一個入棧...

    猜你喜歡

    android(活動生命周期)

    Activity類中定義了7個回調方法,覆蓋了活動生命周期的每一個環節. 1.onCreate().每個活動中我們都要重寫這個方法,它會在活動第一次被創建的時候調用.你應該在這個方法中完成活動的初始化操作,比如說加載布局、綁定事件。 2.onStart().這個方法在活動由不可見變為可見的時候調用. 3.onResume().這個方法在活動準備好和用戶進行交互的時候調用.此時活動一定位于返回棧的棧...

    安卓基礎知識回顧------Activity生命周期

    Activity生命周期 下面我要介紹的是Activity的七個狀態方法 然后附我代碼一篇: **onCreate(Bundle savedInstanceState) onStart() onResume() onPause() onStop() onDestroy() onRestart() **onCreate(Bundle savedInstanceState) Activity的初始化,...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    精品国产乱码久久久久久蜜桃不卡