Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Khác biệt giữa onCreate() và onStart() trong Android?

Giới thiệu

Bài viết giải thích sự khác biệt giữa hai callback vòng đời Activity quan trọng: onCreate() và onStart().

Tóm tắt nhanh

Đặc điểmonCreate()onStart()
Lần gọiChỉ 1 lần khi Activity tạo lần đầuNhiều lần (mỗi lần Activity visible)
Thời điểmKhởi tạo, trước khi hiển thị UINgay trước khi Activity hiển thị cho user
Công việc chínhsetContentView, init view, binding, ViewModel, restore stateBắt đầu animation, register listener, start sensor, resume music
Bundle savedInstanceStateCó (khác null nếu recreate)Không có
Có thể gọi lại?Không (trừ khi process killed & recreate)Có (khi back từ Activity khác, unlock screen, etc.)

Các bước thực hiện (Demo log vòng đời)

Bước 1: Tạo dự án mới

Khởi tạo project Android Studio.

Bước 2: Layout (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Chúc bạn một ngày tốt lành!"
        android:textSize="35dp"
        android:textStyle="bold"
        android:textColor="@color/colorAccent"
        android:layout_centerInParent="true"
        android:padding="20sp"
        android:layout_gravity="center_vertical" />
</LinearLayout>

Bước 3: Ghi log cả hai method (src/MainActivity.java)

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "VongDoiActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate" + (savedInstanceState != null ? " - Restored" : " - First time"));
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart - Activity visible to user");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume - Activity interactive");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause - Losing focus");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop - No longer visible");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy - Destroying");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "onRestart - Restarting after stop");
    }
}

Bước 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Chạy ứng dụng & Quan sát Logcat

Kết nối thiết bị, nhấn Run. Mở Logcat lọc tag "VongDoiActivity".

Senaryo 1: Khởi động app lần đầu

I/VongDoiActivity: onCreate - First time
I/VongDoiActivity: onStart - Activity visible to user
I/VongDoiActivity: onResume - Activity interactive

Senaryo 2: Nhấn Home → Mở app lại

I/VongDoiActivity: onPause - Losing focus
I/VongDoiActivity: onStop - No longer visible
--- Mở app lại ---
I/VongDoiActivity: onRestart - Restarting after stop
I/VongDoiActivity: onStart - Activity visible to user
I/VongDoiActivity: onResume - Activity interactive

→ onCreate KHÔNG gọi lại

Senaryo 3: Mở Activity khác → Back về

I/VongDoiActivity: onPause
I/VongDoiActivity: onStop
--- Back từ Activity khác ---
I/VongDoiActivity: onRestart
I/VongDoiActivity: onStart
I/VongDoiActivity: onResume

Senaryo 4: Xoay màn hình (config change)

I/VongDoiActivity: onPause
I/VongDoiActivity: onStop
I/VongDoiActivity: onDestroy
I/VongDoiActivity: onCreate - Restored
I/VongDoiActivity: onStart
I/VongDoiActivity: onResume

→ onCreate gọi lại với savedInstanceState không null

Chạy ứng dụng demo

Khác biệt giữa onCreate() và onStart() trong Android?

Khi nào dùng onCreate vs onStart?

onCreate() - Khởi tạo một lần

  • setContentView()
  • findViewById() / ViewBinding
  • Khởi tạo ViewModel, Repository, Adapter
  • Setup RecyclerView, Toolbar, Navigation
  • Restore state từ savedInstanceState
  • Đăng ký Observer (LiveData/Flow) - nhưng nên dùng viewLifecycleOwner

onStart() - Mỗi lần hiển thị

  • Bắt đầu Animation/Transition
  • Register Sensor, LocationListener, BroadcastReceiver
  • Resume MediaPlayer, ExoPlayer
  • Bắt đầu theo dõi Firebase Auth state
  • Kiểm tra permission runtime
  • Start Foreground Service

onResume() - Sẵn sàng tương tác

  • Focus vào EditText
  • Show Keyboard
  • Resume Camera preview
  • Analytics screen view

Best Practices

  • Cặp đôi: Register trong onStart/onResume → Unregister trong onStop/onPause
  • Không làm heavy work trong onStart/onResume (block UI thread)
  • Dùng viewLifecycleOwner cho Fragment thay vì Activity lifecycle
  • ViewModel survive config change → không cần restore data trong onCreate
  • SavedStateHandle cho ViewModel lưu state tự động