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

    標簽: 安卓學習  android  安卓  java  移動開發

    安卓的Activity活動棧

    多個安卓Activity中的先后次序問題,需要用活動棧機制
    在這里插入圖片描述

    如圖:

    1. 每當新打開一個Activity時,會入棧,此時只有這個Activity是活動狀態
    2. 除了棧頂的Activity其余的都處于暫停或者停止狀態
    3. 如果內存不足,需要殺死Activity時,會釋放資源使Activity處于非活動狀態

    安卓Activity的活動狀態

    分為四種:

    1. 活動狀態:在活動棧處于棧頂的Activity,能被用戶看到且可以交互,簡單來說就是屏幕當前的Activity
    2. 暫停狀態:當前Activity被部分遮擋,不再處于活動棧棧頂,并且無法交互。這里的部分遮擋是要被Activity遮擋,彈出框之類的不算被遮擋
    3. 停止狀態:當前Activity被完全遮擋。比如按下HOME鍵或者跳轉到別的頁面
    4. 非活動狀態:不是上面三種狀態的Activity,例如被銷毀的Activity

    Activity活動狀態切換觸發回調方法

    在這里插入圖片描述

    如圖,轉化過程如下:

    1. 當Activity生成時調用onCreate、onStart、onResume(相當于可以交互了),之后Activity開始運行
    2. 如果Acttvity處于暫停狀態,會調用onPause
    3. Acitivty重新可以交互時調用onResume
    4. Activity變成停止狀態,調用onPause和onStop
    5. Activity從停止狀態變成活動狀態,會調用onRestart和onStart和onResume方法
    6. 當前Activity從活動狀態直接被銷毀依次調用onPause、onStop、onDestory
    7. 當Activity處于暫停狀態或者停止狀態時,如果內存不足需要殺死Activty,進程終止,再打開需要重新生成

    代碼:

    package net.onest.activitych0402;
    
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.PersistableBundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.EditText;
    
    public class MainActivity extends AppCompatActivity {
    
        private EditText etMsg;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Log.e("MainActivity","onCreate");
            etMsg = findViewById(R.id.et_msg);
            if (null != savedInstanceState){
                Log.e("onCreate",savedInstanceState.getString("msg"));
            }
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.e("MainActivity","onStart");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.e("MainActivity","onRestart");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.e("MainActivity","onResume");
            //將數據進行恢復(讀取文件,查詢數據庫等)
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.e("MainActivity","onPause");
            //將頁面的用戶數據進行保存(文件、數據庫中)
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.e("MainActivity","onStop");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.e("MainActivity","onDestroy");
        }
    
        public void buttonClicked(View view) {
            switch (view.getId()){
                case R.id.btn_dialog:
                    Intent intent = new Intent();
                    intent.setClass(MainActivity.this,
                            DialogActivity.class);
                    startActivity(intent);
                    break;
                case R.id.btn_new:
                    Intent intent1 = new Intent();
                    intent1.setClass(MainActivity.this,
                            NewActivity.class);
                    startActivity(intent1);
    //                finish();
                    break;
            }
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            Log.e("MainActivity","onSaveInstanceState");
            super.onSaveInstanceState(outState);
            //保存用戶數據
            outState.putString("msg",etMsg.getText().toString());
        }
    
        @Override
        protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
            Log.e("MainActivity","onRestoreInstanceState");
            super.onRestoreInstanceState(savedInstanceState);
            //恢復用戶數據
            String content = savedInstanceState.getString("msg");
            //顯示到界面
            etMsg.setText(content);
        }
    }
    
    

    PS:

    1. 如果想處于暫停狀態,需要一個Activity覆蓋到當前的Activity上面,并且不是完全覆蓋,操作如下:

    在資源目錄下的values的styles.xml文件中,寫一個樣式,例如:

    <resources>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>
    	// 這里item是定義自己獨特的地方的標簽,我們需簡要吧windowIsFloating設置為true
        <style name="DialogActivity" parent="AppTheme">
            <item name="android:windowIsFloating">true</item>
        </style>
    
    </resources>
    

    在manifests中設置activity的樣式

            <activity
                android:name=".DialogActivity"
                android:theme="@style/DialogActivity" /> <!--此處樣式改成上面寫好的那個-->
    

    跳轉到這樣生成的Activity上,原來的就會處于暫停狀態

    2.

    在返回時使用finish方法結束當前Activity,而不是去跳轉回原來的Activity,
    如果跳轉回去就會產生兩個不一樣的Activity

    	// 比如我從MainActivity跳轉到NewActivity
    	Intent intent = new Intent();
    	intent.setClass(MainActivity.this,NewActivity.class);
    	startActivity(intent);
    	// 如果在NewActivity中使用finish方法就會回到MainActivity中,并且只有一個
    	// 如果用下面的這種方法,會產生兩個MainActivity,假如第一個Activity中已經寫好部分信息,跳轉回去產生新的MainActivity中不會有那部分信息 
        Intent intent = new Intent();
        intent.setClass(NewActivity.this,MainActivity.class);
        startActivity(intent);	
    

    3.ToolBar工具欄

    我們需要在XML中先設置一個樣式=>沒有ActivityBar的樣式
    資源位置還在剛才的styles.xml文件中寫

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> => 此處parent為重點
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    

    然后在布局中添加一個ToolBar(需要有這個的布局中寫)

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary"
            app:title="新的Activity"
            app:navigationIcon="@drawable/back"/> => 這個地方設置返回按鈕
    

    最后在java代碼中替換掉ActivityBar

    	Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar); // 找到組件
    	toolbar.setTitle("ToolBarDemo"); // 設置標題
    	setSupportActionBar(toolbar); // 替換
    

    手機的橫豎屏轉換時的問題

    當橫豎屏轉換時,會將原來的Activity銷毀,產生一個新的Activity,導致的問題是原來寫好的內容沒了。
    此時有兩種方法可以解決:

    1. 借助onPause和onRestart方法將數據存到文本或者數據庫中
    2. 借助兩個回調方法臨時保持狀態(第一個方法也是兩個回調方法,不是那兩個)

    第二種的實現方式為重寫onSaveInstanceState和onRestoreInstanceState方法,兩個方法都有參數Bundle,借助于Bundle存鍵值對即可,例如:

        @Override
        protected void onSaveInstanceState(Bundle outState) {
            Log.e("MainActivity","onSaveInstanceState");
            super.onSaveInstanceState(outState);
            //保存用戶數據
            outState.putString("msg",etMsg.getText().toString());
        }
    
        @Override
        protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
            Log.e("MainActivity","onRestoreInstanceState");
            super.onRestoreInstanceState(savedInstanceState);
            //恢復用戶數據
            String content = savedInstanceState.getString("msg");
            //顯示到界面
            etMsg.setText(content);
        }
    

    PS:onCreate的參數Bundle和這兩個回調方法的Bundle是同一個對象

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

    智能推薦

    Activity的生命周期

    I.何為Activity? 是Android的四大組件中最直觀的一個,可以狹義地理解為Activity是與用戶交互的界面,可以處理與用戶交互的事件。簡單說就是看到的界面。 常見的 Activity 類型有 ListActivity,FragmentActivitiy,TabAcitivty 等。當然開發中可根據自己的功能設計自己的公共基類: BaseActivity。...

    Activity的生命周期

    Activity作為Android的四大組件之首,生命周期當然是重中之重了。 雖然都是老生常談的面試題了。。。但是被面試官問到了,還是不會的話, 尷尬不是一點點啊。(⊙﹏⊙)b Activity—其實我更愿意喊它一聲“界面”唄。我們在手機上看到的一個窗口,就是它啊。 它的生命周期也分為兩種情況: 第一:正常情況下的生命周期 第二:非正常情況下的生命周期:比如屏幕...

    Activity的生命周期

    Activity的生命周期 工作一年多,發現很多基礎的東西都忘了,抽空在學習一哈 Activity的生命周期,總共分為:onCreate(), onStart(), onRestart(), onResume(),onStop()以及onDestory().一個Activity一般情況下是如何切換的呢,文字表達太麻煩,直接上圖: 那么當新的Acticity被啟動時,原Activity的流程,如下:...

    猜你喜歡

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

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