亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

全部開發者教程

Android 入門教程

菜單類控件
菜單:Menu
并發編程
多線程

活動:Activity

從今天開始將會學習一個非常重要的概念——Android 四大組件,在 Android 中幾乎所有的功能都和四大組件密不可分,而 Activity 是其中出場率最高的組件,也是對用戶感知度最高的組件,當然也可以說是四大組件中最重要的一個組件。我們前面的絕大部分邏輯代碼也都是在 Activity 中實現的,接下來詳細介紹一下第一大組件——Activity。

1. Activity 的基本定義

An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView. While activities are often presented to the user as full-screen windows, they can also be used in other ways: as floating windows (via a theme with android.R.attr.windowIsFloating set) or embedded inside of another activity (using ActivityGroup).

以上是摘自官方文檔中對 Activity 的部分解釋,用我不太流利的英語給大家翻譯一下, 英語不太好的同學可以將就著看看:

Activity 提供給用戶一個單一的、獨立操作的用戶界面,幾乎所有的 Activity 都可以和用戶進行交互,所以 Activity 類的主要功能是創建一個窗口來承載我們通過setContentView設置的 UI 界面,從而展示給用戶。大部分場景下,Activity 會以全屏的形式占滿手機屏幕,但是也支持浮窗或者內嵌的形式。

其實簡而言之,Activity 就是一個用戶界面,類似 Windows 系統里的窗口的概念,而第一個啟動的 Activity,我們稱之為主 Activity。

2. Activity 的生命周期

如果你學習過 C/C++ 或者 Java 開發應該很熟悉main()函數,沒錯,一切代碼都是從main()函數開始的。在 Android 中也有類似的概念,每個 Android 應用程序都有一個主 Activity(啟動 Activity),而其中的onCreate()方法就是所有代碼的起點。

2.1 生命周期的各個流程

Android 系統為每個 Activity 設計了完備的生命周期,在各個不同的生命周期我們都可以做不同的工作,Activity 生命周期流程圖如下:

Activity生命周期

上圖中的每一個矩形框代表一個生命周期方法,Activity 一共有 7 個生命周期。當然我們在實際開發中并不需要全部都實現,只需根據具體需求在合適的時機去實現相應的生命周期方法即可,這就要求開發者對每個生命周期回調的時機和意義比較了解,下面我們來解讀一下每個生命周期的調用時機:

  • onCreate():
    在 Activity 被創建的時候回調,也是 Activity 的第一個生命周期方法,在整個生命周期中只會執行一次。通常會在這里執行頁面的初始化邏輯,大部分的 Activity 相關的代碼都會在這里執行
  • onStart():
    當 Activity 對用戶可見的時候回調,注意此時可能還不能交互,可以用來統計頁面曝光
  • onResume():
    當 Activity 獲取系統焦點的時候回調,此時已經可以和用戶交互
  • onPause():
    當 Activity 暫停的時候回調,此時用戶已經不能交互,并且暫停執行正常業務代碼。通常這時候會回調下一個或者上一個 Activity 的onResume()
  • onStop():
    當 Activity 不可見的時候回調,此時結束曝光
  • onRestart():
    在“Stop”之后,再次回到 Activity 時觸發此方法
  • onDestroy():
    此生命周期觸發標志著 Activity 銷毀,是最后一個生命周期,和onCreate()一樣,只會調用一次,接著系統就會回收掉這部分資源

這 7 個生命周期不是單純的線性運動,從上圖可以看出除了第一個和最后一個:onCreate()、onDestroy()之外,其他的都是可以反復循環的。

2.2 生命周期常見問題及誤區

**另外要特別注意的,也是面試中非常容易被問到的一個經典問題:**從 Activity A 啟動到 Activity B,再從 B 退回到 A,所經歷的生命周期方法依次是哪幾個?
大家可以先根據生命周期流轉圖及各生命周期的定義自行思考一下,分割線后給出答案。


我們來分析一下這個問題,首先是 Activity A 的啟動:

A onCreate -> A onStart() -> A onResume()

到這里 A 就啟動完畢了,接下來啟動 Activity B,此時系統會將焦點移動到 B 上,故 A 的 onPause() 會被調用,接著創建 Activity B,那么流程是這樣的:

A onPause() -> B onCreate() -> B onStart() -> B onResume()

此時 B 已經啟動完畢,大家注意到 A 的onStop()自始至終還未執行,我們再次回憶一下onStop()的定義:“當 Activity 不可見的時候回調”。所以此時要分兩種情況,如果 Activity B 是全屏的類型,那么在 B 啟動之后系統會回調 Activity A 的 onStop();但是前面提到過,Activity可以是浮窗類型,此時 A 的onStop()則不會被回調,這是一個關鍵點,大家一定要記?。。?/p>

所以從 Activity A 跳轉 Activity B 的生命周期觸發順序如下:

A onCreate -> A onStart() -> A onResume() -> 跳轉 B -> A onPause() -> B onCreate() -> B onStart() -> B onResume() -> if (B is full screen) { A onStop() }

此時如果從 B 在返回到 A 的話,按照以上原理不難理解:

B onPause() -> A onRestart() -> A onStart() -> A onResume() -> B onStop() -> B onDestroy()

由于從 B 返回 A 需要銷毀 B,所以此時不論 A 是否是全屏類型都會在 A 恢復之后依次調用 B 的onStop()onDestroy()。這個是面試必考題,大家務必掌握!


3. Activity 示例

關于 Activity 的使用其實從本教程的最開始就一直在用,我們通常都是將核心邏輯放在了onCreate()之中,比如setContentView設置布局樣式,findViewById()獲取布局中的控件實例,綁定監聽器等等,所以 Activity 的用法相信大家并不陌生,這里主要是希望大家對除了 onCreate()方法之外的其他生命周期時機有所了解。我們將在 7 個生命周期中加入 Log 日志,觀察一下各個生命周期的回調時機,編寫 Activity 代碼如下:

package com.emercy.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    String TAG = "Android Lifecycle";

    // 第一個被調用的方法,當 Activity 被創建時調用
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "The onCreate() event");
    }

    // Activity 可見
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "The onStart() event");
    }

    // Activity 獲取焦點,可交互
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "The onResume() event");
    }

    // Activity 失焦
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "The onPause() event");
    }

    // Activity 停止,不可見
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "The onStop() event");
    }

    // Activity 銷毀
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "The onDestroy() event");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "The onRestart() event");
    }
}

編譯運行,系統自動啟動 MainActivity,此時觀察 Logcat 輸出:

Activity 啟動

接著點擊“Home”退出 Activity,然后切換回來,觀察 Logcat 如下:

Activity 切換

最后點擊 back 退出 App,再次觀察 Logcat:

Activity 退出

通過 Logcat 可以觀察到生命周期的跳轉符合預期。

4. 小結

本節介紹了 Android 四大組件中的第一大組件,也是用的最多、責任最大的組件,其中最關鍵的是要掌握各個生命周期的調用時機及含義。
首先分析了 Activity 7 個生命周期的流轉,以及各個生命周期的意義,接著通過一個示例配合具體的用戶行為通過 Logcat 的形式打印了生命周期的變化,理論結合實際相信你會對 Activity 的生命周期有了更深的理解。中間還分享了一個關鍵點,也是面試中經常遇到的問題,希望大家牢牢掌握!