android學習之旅(11)--Activity與Fragment

Activity

Activity是Android的四大組件之一,在Android應用的開發中佔有舉足輕重的作用。簡單來說我們在屏幕上看到界面就是一個Activity,它表示一個單一屏幕的用戶界面。

創建Activity

(1)新建類繼承Activity或其子類
(2)在AndroidManifest中聲明(註冊)
(3)創建layout並在新建類的onCreate方法中設置

  • 如果是使用繼承開發環境那麼在創建新的Activity時,編譯器會自動完成上述步驟

Activity的生命週期

在Android中Activity的運行使用了回調機制,Activity在不同的生命週期中切換時,就會觸發對應的回調函數。開發者就可以通過重寫方法進行相關業務的處理。
Activity大致會經過4種狀態:
(1)運行轉態:當前Acticity位於前臺,用戶可見,可以獲得焦點。
(2)暫停狀態:其他Actictiy位於前臺,該Actictiy依然可見,只是不能獲得焦點。
(3)停止狀態:該Acticity失去焦點。
(4)銷燬狀態:該Acticity結束,或者Acticity所在的進程被結束。

Acticity的生命週期

方法 調用時機
onCreate() 創建Acticity時被回調,該方法只會被調用一次
onStart() 啓動Acticty時被回調
onRestart() 重新啓動Acticity時被回調
onResume() 恢復Acticty時被回調。在onStart()方法之後一定會回調onRestart()方法
onPause() 暫停Acticity時被回調
onStop() 停止Acticity時被回調
onDestroy() 銷燬Acticity時被回調。該方法只會被調用一次。

通過代碼觀看Acticity的生命週期

package com.kong.viewtext;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class LifeCycleActivity extends AppCompatActivity {

    private Button m_ChangeActicity;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_cycle);
        m_ChangeActicity=findViewById(R.id.changeActicity);
        m_ChangeActicity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setClass(LifeCycleActivity.this,MainActivity.class);
                startActivity(intent);
                Log.v("ActivityLifeCycle","切換Acticty");
            }
        });
        Log.v("ActivityLifeCycle","--onCreate--");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v("ActivityLifeCycle","--onDestroy--");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.v("ActivityLifeCycle","--onRestart--");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.v("ActivityLifeCycle","--onResume--");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.v("ActivityLifeCycle","--onStart--");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.v("ActivityLifeCycle","--onPause--");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.v("ActivityLifeCycle","--onStop--");
    }
}

Acticty回調函數的調用時機

Acticity的4種加載模式

android的四大組件在使用時都需要在清單文件中註冊,配置Acticity是可以指定android:launchMode屬性,該屬性用於配置該Acticity的加載模式。該屬性支持如下4個屬性值。

standard: 標準模式,默認加載模式

singleTop: Task棧頂單例模式

singleTask: Task棧內單例模式

singleInstance: 全局單例模式

在Android中採用Task來管理多個Acticity,當我們啓動一個任務棧時Android就會創建一個任務棧(該棧的名稱默認爲包名),用來管理Acticity,按啓動的順序依次進棧。而加載模式(負責管理實例化)就決定了Actictiy按何種方式加載在前臺。

  • standard模式:
    在該模式下,Acticity每次都會被實例化,並且將該Acticity添加到當前的任務棧中,這種模式不會啓動新的任務棧,新的Acticity將被添加到原來的任務棧中。

  • singleTop模式:
    在該模式下,當要啓動的Acticity位於任務棧的棧頂時,系統不會重新創建目標Acticity的示例,而是直接複用已有的Acticity的實例。如果將要啓動的Acticity沒有位於任務棧的棧頂,該模式和標準模式相同。

  • singleTask模式:
    在該模式下,當要啓動的Acticity在任務棧中已經存在(無論是不是在棧頂)系統就會直接複用棧中已存在的實例。需要注意的是:如果將要啓動的Acticity不在任務棧的棧頂時,系統會將棧中位於當前Acticity之上的所有Acticity全部移除,從而使得當前Acticity位於棧頂。

  • singleInstance模式:
    在該模式下,系統保證無論從那個任務棧中啓動目標Acticty,只會創建一個目標Acticity實例,並會使用一個全新的任務棧來加載該Acticity實例。
    當系統採用singleInstance模式啓動目標Acticity時,可以分爲以下兩種情況:
    (1)如果將要啓動的目標Acticity不存在,系統會先創建一個全新的任務棧,在創建目標Acticty的實例,並將它加入新的任務棧棧頂。
    (2)如果將要啓動的目標Acticity已經存在,無論它位於那個應用程序中,位於那個任務棧中,系統都會將該Acticity轉到前臺,從而使該Acticity顯示出來。

Fragment

Fragment是在Android3.0之後引入的新API,它的意思是“碎片”,Fragment擁有自己的生命週期,也可以接受它自己的輸入事件。其目的是爲了適應不同屏幕分辨率、支持更加動態和靈活的UI設計。Fragment實際可以看成一個子模塊,它必須在Acticity中使用,不能單獨脫離Acticity,它和Acticity的關係是“多對多”的,而且擁有自己的佈局文件,這樣就可以將多個Acticity中相同的部分,“抽取”出來作成一個Fragment,這樣就可以實現界面的複用。此外,Fragment也擁有自己的生命週期,不過其生命週期受它所在的Acticity的影響。

Fragment的特徵

Fragment簡化了大屏幕UI的設計,它不需要開發者管理組件包含關係的複雜變化,開發者使用Fragment對UI組件進行分組、模塊化管理,就可以更方便地在運行過程中動態更新Acticity的用戶界面。Fragment擁有以下特徵:

  • Fragment總是作爲Acticity界面的組成部分。Fragment可調用getActicity()方法獲取它所在的Acticity,Acticity可以調用FragmentManager的findFragmentById()或findFragmentByTag()方法來獲取Fragment。

  • 在Acticity運行過程中,可調用FragmentManager的add()、remove()、replace()方法進行動態的添加、刪除或替換Fragmrnt。

  • 一個Acticity可以同時組合多個Fragment;反過來一個Fragment也可以多個Acticity複用。

  • Fragment可以響應自己的輸入事件,並擁有自己的生命週期,但它們的生命週期直接被其所屬的Acticity的生命週期控制。

Fragment的優點

1、Fragment可以Acticity分離多個可重用的組件。
2、Fragment可以輕鬆的創建動態靈活的UI設計,可以適應的不同的分辨率。
3、Fragment是一個獨立的模塊,僅僅地與Acticity綁定在一起,可以動態的進行移除、加入、交換等操作。
4、Fragment提供一個新的方式在不同的安卓設備上統一UI。
5、Fragment切換流暢、輕量切換。
6、Fragment替換TabActicity做導航,性能更好。

Fragment的生命週期

與Acticity類似,Fragment也存在如下狀態:

運行狀態: 當前Fragment位於前臺,用戶可見,可以獲得焦點。

暫停狀態: 其他Acticity位於前臺,該Fragment依然可見,只是不能獲得焦點。

停止狀態: 該Fragment不可見,失去焦點。

銷燬狀態: 該Fragment被完全刪除,或改Fragment所在的Acticity被結束

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PIAek2tq-1578290900099)(./ImageResources/Fragment的生命週期.jpg)]

Fragment生命生命週期中調用的函數

方法 調用時機
onCreate(Bundle savedStatus) 創建Fragment時被回調。該方法只會被回調一次。
onCreateView() 每次創建、繪製該Fragment的View組件時回調該方法,Fragment將會顯示該方法返回的組件。
onActicityCreated() 當Fragment所在的Acticity被啓動完成後調該方法。
onStart() 啓動Fragment時被回調。
onResume() 恢復Fragment時被回調,在onStart方法之後一定會調用onResume()方法。
onPause() 暫停Fragment時被回調。
onStop() 停止Fragment時被回調。
onDestroyView() 銷燬該Fragment所包含的View組件時調用。
onDestroy() 將該Fragment時被回調,該方法只會被調用一次。
onDetach() 將該Fragment從Acticity中刪除、替換完成時回調該方法,在onDestroy()方法後一定會回調onDetach()方法。該方法只會被調用一次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章