Lập trình Android – Bài 10: Vòng đời Activity

Cái gì hoạt động cũng có nguyên tắc, trình tự của nó và Activity cũng vậy. Activity lại là một phần rất rất quan trọng trong một ứng dụng Android, do dó các bạn nên biết và cần biết về hoạt động của nó. Cách hoạt động của Activity như một chu kỳ nên ta gọi nó là vòng đời của Activity.

[qads]

activity_lifecycle

Trên đây là hình ảnh minh họa cho quá trình hoạt động của 1 Activity. Khi Activity được mở lên nó sẽ gọi lần lượt các hàm onCreate (hàm mà chúng ta hay làm đó), tiếp theo là onStart, onResume. Sau hàm onResume thì Activity sẽ chính thức hoạt động và chúng ta có thể thao tác được với Activity như click button,…

  • Hàm onPause được gọi trong 2 TH sau:
    +/ Khi bạn mở một Activity nhưng dưới dạng dialog, tức là Activity này hiện đè lên Activity khác nhưng vẫn nhìn thấy một phần của Activity kia. Không áp dụng cho hiện Dialog mà chi áp dụng cho hiện Activity dưới dạng Dialog.
    +/ Khi Bạn mở một Actiivty khác hoặc một app khác từ danh sách các ứng dụng gần đây. Khi này hàm onPause được gọi và ngay sau đó sẽ gọi hàm onStop.

  • Từ trạng thái pause này Activity có thể chuyển đến 3 trạng thái khác nhau:
    +/ Gọi lại hàm onResume để trở về chạy bình thường khi mà dialog đó bị mất đi
    +/ Gọi đến hàm onStop khi mà chúng ta không gọi dialog mà gọi Activity khác. Tức là từ Activity này gọi một Activity khác hoặc có một chương trình nào đó đè lên nó mà không thể nhìn thấy nó nữa thì nó sẽ gọi qua 2 hàm là onPause và onStop. Khi gọi tới onStop thì trạng thái của Activity là stop.
    +/ Bị chuyển sang trạng thái App process Killed và gọi lại hàm onCreate. Trường hợp này xảy ra khi dung lượng RAM không còn chỗ và hệ thống bắt buộc giết những chương trình, những Activity không dùng trong thời điểm hiện tại.

  • Từ trạng thái Stop, tức là sau khi gọi hàm onStop thì cũng có 3 khả năng xảy ra.
    +/ Bạn tắt chương trình hiện tại hoặc activity hiện tại mà đè lên nó, nó sẽ gọi lại hàm onReStart, sau đó gọi onStart, onResume và lại hoạt động bình thường.
    +/ Bị chuyển sang trạng thái App process Killed, giống như bên trên.
    +/ Gọi đến onDestroy và bị hủy Activity, xảy ra khi bạn tắt Activity hoặc bị hệ thống tắt do thiếu RAM hoặc lỗi gì đó.

Lý thuyết thì thực sự là không dễ hình dung, do đó các bạn Tạo mới Project và thực hành tạo thêm 2 Activity mới. Tức chúng ta có 3 Activity nhé.

android-activity-life-cycle-1

Trong đó Activity Second sẽ được hiển thị dưới dạng dialog, để làm điều này, các bạn sửa trong file AndroidManifest như sau:

<activity
android:name=".SecondActivity"
android:theme="@style/Theme.AppCompat.Dialog"></activity>

Giao diện Main Activity sẽ như này. Chúng ta có 2 button để hiển thị Dialog và Activity. Từ đó chúng ta sẽ quan sát được thấy những gì diễn ra.

android-activity-life-cycle-2

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.nguyenvanquan7826.tut9activityliftcycle.MainActivity">

    <Button
        android:id="@+id/btnShowDialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Dialog" />

    <Button
        android:id="@+id/btnShowActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Show Activity" />
</LinearLayout>

Tiếp theo, ở MainActivity.

package com.nguyenvanquan7826.tut9activityliftcycle;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        System.out.println("Main - onCreate");

        setContentView(R.layout.activity_main);

        connectView();
    }

    private void connectView() {
        findViewById(R.id.btnShowDialog).setOnClickListener(this);
        findViewById(R.id.btnShowActivity).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btnShowDialog:
                showDialog();
                break;
            case R.id.btnShowActivity:
                showActivity();
                break;
        }
    }

    private void showDialog() {
        startActivity(new Intent(this, SecondActivity.class));
    }

    private void showActivity() {
        startActivity(new Intent(this, ThirdActivity.class));
    }

    @Override
    protected void onStart() {
        super.onStart();
        System.out.println("Main - onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        System.out.println("Main - onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        System.out.println("Main - onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        System.out.println("Main - onStop");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        System.out.println("Main - onRestart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("Main - onDestroy");
    }
}

Để viết được các hàm onStart, onPause,… nhanh chóng, các bạn đặt chuột vào vị trí cần viết, nhấn Ctrl + O, sau đó tìm hàm cần viết bằng cách gõ hàm đó. Chẳng hạn muốn viết đè hàm onPause thì các bạn mở Ctrl + O, sau đó viết onPause là sẽ thấy.

Dưới đây là video minh hoạ kết quả nhé.