Giới thiệu về Activity trong Android

Lớp Activity là thành phần quan trọng nhất của ứng dụng Android, cách mà chúng hoạt động tạo thành nền tảng cơ bản của mô hình lập trình ứng dụng. Android khởi chạy một ứng dụng thông thường bằng kích hoạt một Activity tương ứng với vòng đời cụ thể của nó trong quá trình hoạt động.

Thường một Activity cung cấp một của sổ, ở đó ứng dụng sẽ dựng các thành phần UI (User Interface - giao diện người dùng). Mặc định cửa sổ này là đầy màn hình thiết bị, nhưng có một vài trường hợp riêng sẽ nhỏ hơn và nổi phía trên cửa sổ khác.

Hầu hết các ứng dụng đều sử dụng nhiều màn hình khác nhau, có nghĩa nó sẽ phải có nhiều Activity khác nhau. Khi một Activity chỉ định là Activity chính, nó sẽ là màn hình đầu tiên khi khởi chạy ứng dụng. Một Activity này lại có thể gọi và kích hoạt một Activity khác. Ví dụ một Activity hiện thị danh sách các ghi chú, nó gọi một Activity khác để xem nội dung chi tiết của ghi chú.

Activty

Xem hình trên, ứng dụng khởi chạy với Activity - A, Activity - A kích hoạt Activity - B bằng Intent, Activity - B hoạt động có thể gọi Activity - C và khi bấm nút Back của điện thoạt Activity được gọi sẽ đóng và trở này Activity gọi nó

Vòng đời một Activity

Để tạo một Activity thì bạn phải tạo ra một lớp kế thừa lớp Activity, sau đó triển khai tối thiểu phương thức onCreate(Bundle savedInstanceState), sau đó tùy ngữ cảnh mà khi Activity hoạt động vòng đời của nó diễn ra như mô tả ở hình sau:

vong doi Activity

Nhìn vào hình, ta thấy có các mốc chính trong quá trình hoạt động của Activity tương ứng với các phương thức mà bạn có thể quá tải là:

  • onCreate(Bundle savedInstanceState): Được gọi khi hoạt động mới được tạo, tại đây khởi tạo các biến, nạp giao diện layout ..., phương thức này cũng nhận dữ liệu lưu lại trạng thái hoạt động trước đó (với mục đích để phục hồi - savedInstanceState). Sau sự kiện này bao giờ cũng gọi ngay lập tức onStart().
  • onStart(): Được gọi ngay trước khi Activity hiển thị trên màn hình.
  • onResume(): Được gọi ngay khi Activity bắt đầu có thể tương tác với người dùng, và Activity nằm trên cùng trong danh sách các Activity của hệ thống. Sau phương thức này là các chức năng của Activity hoạt động dựa trên tương tác của người dùng ..., cho đến khi có một nguyên nhân nào đó mà phương thức OnPause được gọi.
  • onPause(): Được gọi khi hệ thống sắp kích hoạt một Activity khác, nếu bạn quá tải phương thức này, thường để lưu lại dự liệu thật nhanh để hệ thống còn kích hoạt Activity khác. Ngay sau phương thức này nó sẽ gọi onResume() nếu Activity được kích hoạt lại ngay, hoặc gọi OnStop() nếu Activity bị ẩn đi.
  • onStop(): Được gọi khi nó bị ẩn đi. Sau phương thức này, Activity có thể gọi onRestart() nếu nó được người dùng kích hoạt lại hoặc gọi onDestroy() để hết thúc.
  • onDestroy(): gọi khi Activity bị hủy hoàn toàn (ví dụ gọi finish(), hoặc người dùng kill Activity)

Tạo một ứng dụng Activity đơn giản

Để tìm hiểu các sự kiện với vòng đời Activity, tạo ra một ứng dụng Android đơn giản nhất như sau:

Từ Android Studio chọn New Project, hộp thoại hiện thị ra điền các thông tin: phần Application name điền ExamActivity, trong phần company domain điền xuanthulab.net, sau đó nhấn Next, để mặc định nhấn Next đến hộp thoại Add and Activity to Mobile chọn mục Add no Activity (để bạn tự thêm Activity, mục đích luyện tập).

Giờ bạn tạo ra một lớp có tên FirstActivity, kế thừa từ lớp Activity như sau:

Nhấn phải chuột vào Project và chọn New > Java class, hộp thoại hiện thị ra tạo điền các thông tin sau:

activity

Tương tự, bạn nhấn phải chuột vào res > layout, chọn New > layout resource file, đặt tên file tạo ra activity_first.xml, và cập nhật nội dung layout này như sau:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    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"
    tools:context="net.xuanthulab.examactivity.FirstActivity">

    <Button
        android:id="@+id/buttonsetdate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Set Date"/>

</android.support.constraint.ConstraintLayout>

Mở FirstActivity.java và cập nhật nội dung như sau:

package net.xuanthulab.examactivity;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.DatePicker;

public class FirstActivity extends Activity {

    private final String TAG = "FirstActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        
        findViewById(R.id.buttonsetdate).setOnClickListener(
            new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Mở Activity quay số điện thoại
                Intent intent = new Intent(Intent.ACTION_DIAL);
                startActivity(intent);

            }
        });
        

        Log.d(TAG, "onCreate");

    }


    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");

    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");

    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");

    }

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

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");

    }
}

Để Activity hoạt động được còn phải khai báo trong manifests, mở manifests và cập nhật như sau

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.xuanthulab.examactivity">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true">
        
        <activity android:name=".FirstActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Giờ bạn chạy thử ứng dụng và mở Logcat của Android Studio để xem các sự kiện diễn ra trong quá trình chạy ứng dụng

Từ khi kích hoạt ứng dụng, đến khi xuất hiện giao diện để tương tác xảy ra các sự kiện

logcat

Bấm vào nút Set Date để mở một Activity khác, thấy xảy ra các sự kiện:

logcat

Đang ở Activity quay số nhấn để quay lại Activity của ứng dụng, thấy xảy ra các sự kiện:

logcat

Khi ứng dụng đang chạy, quay ngang màn hình thấy xảy ra một loạt sự kiện như sau:

logcat

Như vậy khi Activity đang hoạt động, nếu quay ngang màn hình (ứng dụng hỗ trợ xoay ngang) thì nó sẽ hủy Activity và khởi tạo từ đầu một Activity khác (Hàm onDestroy được gọi và hàm onCreate mới được gọi)