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

    標簽: Activity生命周期

    理解活動的生命周期,有利于我們合理管理應用資源,寫出更加流暢的程序。
    Android是使用任務Task來管理活動的,一個任務就是一組存放在棧里的活動的集合,這個棧成為返回棧BackStack,棧是一種先進后出的數據結構。
    每個活動在其生命周期中最多有四種狀態
    1、運行
    活動位于棧頂時,這個活動就是運行狀態。
    系統最不愿意回收這種活動。
    2、暫停
    活動不再處于棧頂,但是仍然可見時,這個活動處于暫停狀態,比如,活動上方有一個對話框(Activity形式的彈窗)彈出。
    官方的解釋是:
    onPause() Called when the system is about to start resuming another activity.
    只有再啟動另外一個Activity的時候才會進入onPause狀態,而不是想象中的被覆蓋或者不可見
    特別注意,只有在彈出的是一個活動形式的彈框時,才會對底層活動有影響,進入onPause()狀態,如果是Toast和AlertDialog彈窗則對底層活動無影響,同時通過AlertDialog源碼或者Toast源碼我們都可以發現它們實現的原理都是windowmanager.addView();來添加的, 它們都是一個個view ,因此不會對activity的生命周期有任何影響。
    只有在內存極低的情況下,系統才回去考慮回收這種活動
    3、停止
    活動不再處于棧頂,且不可見時,就進入了停止狀態。
    此時系統仍然會為這種活動保存響應的狀態和成員變量,但并不是完全可靠的,當其他地方需要內存時,這種狀態的活動有可能被系統回收。
    4、銷毀
    當一個活動從返回棧中移除后,就變成了銷毀狀態。
    比如一個棧內先后存入活動1、2、3,當前處于活動3,點擊返回鍵返回活動2,則活動3執行onDestroy()
    系統最傾向于回收這種狀態的活動。

    Activity類中定義了7個回調方法供我們使用。
    onCreate()
    在活動第一次被創建的時候調用
    我們應該在這個方法中完成活動的初始化操作,比如加載布局,綁定事件等等。
    onStart()
    在活動由不可見變為可見的時候調用
    onResume()
    在活動準備好與用戶交互的時候調用,此時活動處于返回棧的棧頂,并且處于運行狀態。
    onPause()
    在系統準備啟動或者恢復另外一個活動的時候調用
    我們在這個方法中可以將一些消耗CPU的資源釋放掉,保存一些關鍵數據,這個方法執行速度一定要快,否則會影響新的棧頂活動的使用
    onStop()
    在活動完全不可見的時候調用

    onStop()onPause()的區別是,如果啟動的新活動是對話框活動,覆蓋了原有活動,但原有活動仍然可見,則執行的是onPause()

    onDestroy()
    活動被銷毀之前調用,之后活動變為銷毀狀態
    onRestart()
    活動由停止變為運行狀態之前調用,即活動被重新啟動

    總結:
    完整生存期
    onCreate()到onDestroy()之間所經歷的就是完整生存期
    可見生存期
    onStart()到onStop()之間所經歷的就是可見生存期,對用戶是可見的
    前臺生存期
    onResume()到onPause()之間經歷的就是前臺生存期,這個周期活動總是處于運行狀態,與用戶進行交互。

    活動生存周期圖見下圖
    這里寫圖片描述

    創建程序體驗Activity的生命周期
    1、創建三個活動,分別是活動1、2、3,活動1為主活動,點擊活動1的按鈕啟動活動2,點擊活動2的按鈕啟動活動3
    2、活動3中設置三個按鈕,分別可以啟動AlertDialog,Activity彈窗,Toast,觀察這幾個彈出窗口對底層活動3生命周期的影響

    貼代碼:
    活動1、2、3的XML代碼就不寫了,很簡單。
    活動1Java代碼:

    /**
     * Created by RyShine on 2018/5/26.
     * 1、點擊按鈕跳轉至下一頁,觀察該活動生命周期
     */
    
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.i("MainActivity", "onCreate()");
            setContentView(R.layout.activity_main);
    
            Button act1st_btn = findViewById(R.id.act1st_btn);
            act1st_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //顯示Intent啟動下一個活動
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.i("MainActivity", "onStart()");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.i("MainActivity", "onResume()");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.i("MainActivity", "onPause()");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.i("MainActivity", "onStop()");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.i("MainActivity", "onRestart()");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.i("MainActivity", "onDestroy()");
        }
    }

    活動2的Java代碼:

    /**
     * Created by RyShine on 2018/5/26.
     * 1、點擊按鈕跳轉至下一頁,觀察該活動生命周期
     */
    
    public class SecondActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.i("SecondActivity", "onCreate()");
            setContentView(R.layout.activity_second);
    
            Button act2nd_btn = findViewById(R.id.act2nd_btn);
            act2nd_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //隱式Intent啟動下一個活動
                    Intent intent = new Intent("com.ryshine.lifecycletest.start");
                    intent.addCategory("com.ryshine.lifecycletest.start");
                    startActivity(intent);
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.i("SecondActivity", "onStart()");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.i("SecondActivity", "onResume()");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.i("SecondActivity", "onPause()");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.i("SecondActivity", "onStop()");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.i("SecondActivity", "onRestart()");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.i("SecondActivity", "onDestroy()");
        }
    }

    活動3的Java代碼:

    /**
     * Created by RyShine on 2018/5/26.
     * 1、點擊按鈕跳出彈窗,觀察該活動生命周期
     * 2、注意兩種對話框對活動生命周期的影響
     * AlertDiaolog、Toast對底層活動生命周期無影響
     * 對話框式的活動對底層生命周期有影響
     */
    
    public class ThirdActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.i("ThirdActivity", "onCreate()");
            setContentView(R.layout.activity_third);
    
            Button act3rd_btn = findViewById(R.id.act3rd_btn);
            Button act3rd_btn2 = findViewById(R.id.act3rd_btn2);
            Button act3rd_btn3 = findViewById(R.id.act3rd_btn3);
            act3rd_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //新建一個對話框
                    AlertDialog.Builder dialog = new AlertDialog.Builder(ThirdActivity.this);
                    //設置對話框的標題
                    dialog.setTitle(R.string.dialog_title);
                    //設置對話框的信息
                    dialog.setMessage(R.string.dialog_tips);
                    //設置對話框可以由返回鍵關閉
                    dialog.setCancelable(true);
                    //顯示彈窗
                    dialog.show();
                }
            });
    
            act3rd_btn2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //啟動一個對話框式的活動
                    Intent intent = new Intent(ThirdActivity.this, DialogActivity.class);
                    startActivity(intent);
                }
            });
    
            act3rd_btn3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //Toast彈窗
                    Toast.makeText(ThirdActivity.this, "這是Toast!", Toast.LENGTH_SHORT).show();
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.i("ThirdActivity", "onStart()");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.i("ThirdActivity", "onResume()");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.i("ThirdActivity", "onPause()");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.i("ThirdActivity", "onStop()");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.i("ThirdActivity", "onRestart()");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.i("ThirdActivity", "onDestroy()");
        }
    }
    

    活動3中啟動的Activity式彈窗的Java代碼

    package com.ryshine.lifecycletest;
    
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    
    /**
     * Created by RyShine on 2018/5/26.
     */
    
    public class DialogActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_dialog);
        }
    }
    

    AndroidManifest中的代碼:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.ryshine.lifecycletest">
    
        <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=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
            <activity android:name=".SecondActivity"/>
            <activity android:name=".ThirdActivity">
                <intent-filter>
                    <action android:name="com.ryshine.lifecycletest.start"/>
                    <!--必須加上category android:name="android.intent.category.DEFAULT",否則無法啟動該活動-->
                    <category android:name="android.intent.category.DEFAULT"/>
                    <category android:name="com.ryshine.lifecycletest.start"/>
                </intent-filter>
            </activity>
            <!--android:theme="@style/Theme.AppCompat.Dialog"這段代碼將此活動設置為對話框形式-->
            <activity android:name=".DialogActivity"
                android:theme="@style/Theme.AppCompat.Dialog">
            </activity>
        </application>
    </manifest>
    

    程序運行gif及控制臺輸出
    這里寫圖片描述
    控制臺輸出
    這里寫圖片描述

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

    智能推薦

    活動——活動的生命周期

    返回棧 Android是使用任務(Task)來管理活動的,一個任務就是一組存放在棧里的活動的集合,這個棧被稱為返回棧(Back Stack)。 活動生存期 - onCreate():在活動第一次被創建時調用,完成活動的初始化操作,比如加載布局,和綁定事件等。 - onStart():在活動由不可見變為可見時調用。 - onResume():在活動準備和用戶交互的時候調用,此時活動一定位于棧的棧頂,...

    安卓學習之Activity的生命周期

    Activity的不同生命周期 官方文檔https://developer.android.google.cn/guide/components/activities/activity-lifecycle 1.onCreate 表示Activity正在創建中,初始化工作。 2.onRestart 表示Activity正在重新啟動,由不可見變成可以狀態時調用   3.onStart Act...

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

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

    安卓開發基礎入門------Activity生命周期

    給自己做個筆記,溫故而知新! 學習安卓開發,首先必須知道它最基本的常見的四大組件:Activity,Service,ContentProvider,BroadcastReceiver;那么Activity是我們在開發中接觸到最多的組件,所以對它的生命周期一定要有足夠的理解,從它被創建到銷毀是怎樣一個過程,中間經歷了什么,在開發中對程序員來講是由有很大的幫助,就像做數學題,你要知道它的原理你才更容易...

    02 安卓開發之生命周期

    1 Activity四種狀態 Active/Running:  Activity處于活動狀態,此時Activity處于棧頂,是可見狀態,可與用戶進行交互。  Paused:  當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化為Paused狀態。但我們需要明白,此時Activity只是...

    猜你喜歡

    安卓開發-Activity的生命周期+任務棧

    《一:生命周期函數》 1:函數調用: 2:轉換界面時調用函數順序: 3:生命周期類型: 4:在AndroidManifest: 5.1:在Activity中配置(消除橫豎屏,屏幕大小,鍵盤隱藏對Activity生命周期的影響): 5.2:橫豎屏切換生命周期方法執行順序: 6:Activity生命周期圖: 《二:短信的草稿保存》 正常關閉退出Activity后,調用onDestotry(protec...

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

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

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

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

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

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

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

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