Inactive — esensi, status transisi antara Active dan Background

Penulis: IT Sectr Diterbitkan: 2026-03-03 Waktu membaca: 10 mnt

Inactive — status transisi siklus hidup aplikasi antara Active dan Background, di mana aplikasi terlihat di layar tetapi tidak menerima peristiwa sentuhan. Kami menjelaskan bagaimana Inactive terjadi di iOS dan Android, metode delegasi apa yang bertanggung jawab untuknya, dan cara menangani gangguan — panggilan, notifikasi, dan gerakan sistem — dengan benar.

Hal-hal Penting

  • Inactive — aplikasi terlihat di layar tetapi tidak menerima peristiwa sentuhan karena gangguan sistem
  • applicationWillResignActive — metode utama yang menandakan transisi ke Inactive di iOS
  • Karakter sementara — Inactive berlangsung dari sepersekian detik hingga beberapa detik, kemudian dilanjutkan dengan transisi ke Active atau Background
  • Penyebab — panggilan masuk, Control Center, Notification Center, peringatan sistem, Apple Pay, Siri
  • SwiftUI — scenePhase .inactive setara dengan Inactive di UIKit

Inactive — esensi status transisi

Inactive — status perantara siklus hidup aplikasi seluler yang terjadi saat transisi antara Active dan Background. Dalam status ini, aplikasi masih berada di latar depan dan terlihat oleh pengguna, tetapi tidak menerima peristiwa sentuhan, tekanan tombol, atau peristiwa UI lainnya. Sistem memblokir pengiriman peristiwa ke aplikasi, tetapi UI tetap di layar dan tidak diminimalkan.

Sifat Inactive bersifat sementara. Status ini berlangsung tepat selama gangguan sistem berlangsung: dari 0.1 detik saat menutup Control Center dengan cepat hingga beberapa detik saat panggilan masuk dengan layar panggilan. Setelah gangguan berakhir, aplikasi kembali ke Active atau beralih ke Background jika pengguna telah beralih ke aplikasi lain. Inactive adalah satu-satunya status yang memungkinkan transisi di kedua arah: kembali ke Active atau selanjutnya ke Background.

Di iOS, Inactive dikelola secara otomatis oleh sistem. Pengembang tidak dapat memperpanjang atau memperpendek waktu yang dihabiskan di Inactive — ini sepenuhnya dikendalikan oleh UIApplication. Satu-satunya hal yang dapat dilakukan pengembang adalah menangani transisi ke Inactive melalui applicationWillResignActive dan kembali melalui applicationDidBecomeActive dengan benar. Di Android, analognya adalah onPause, meskipun semantiknya berbeda: onPause dipanggil bahkan ketika Activity tertutup sebagian oleh komponen lain.

Perbandingan Inactive di iOS dan Android

Di iOS, Inactive adalah status terpisah dari siklus hidup aplikasi (salah satu dari lima: Not Running, Active, Inactive, Background, Suspended). Di Android tidak ada analog langsung — onPause menandakan bahwa Activity kehilangan fokus input, tetapi mungkin tetap terlihat (misalnya, saat membuka dialog). Perbedaan utama: iOS Inactive adalah status aplikasi secara keseluruhan, Android onPause adalah status Activity tertentu. Dalam mode multi-window di Android, satu Activity bisa dalam onPause (tanpa fokus) sementara yang lain dalam onResume (dengan fokus).

KarakteristikiOS InactiveAndroid onPause
UI terlihatYaYa (sebagian atau seluruhnya)
Peristiwa sentuhanTidak menerimaTidak menerima
DurasiSampai gangguan berakhirSampai fokus kembali atau pergi ke latar belakang
Status berikutnyaActive atau BackgroundonResume atau onStop
TingkatAplikasi (UIApplication)Activity
Multi-windowSatu adegan aktifBeberapa Activity dalam onPause

Kapan Inactive terjadi

Inactive di iOS terjadi dalam beberapa skenario yang ditentukan secara ketat. Pengguna memanggil Control Center (geser ke bawah dari sudut kanan atas di iPhone X+ atau geser ke atas di model lama). Pengguna membuka Notification Center (geser ke bawah dari sudut kiri atas). Panggilan masuk tiba — sistem menampilkan layar panggilan di atas aplikasi. Izin sistem diminta — geolokasi, mikrofon, kamera, kontak. Di iPad, Slide Over atau Split View diluncurkan — adegan aktif menjadi Inactive.

Di Android, onPause (analog Inactive) terjadi dalam rentang situasi yang lebih luas. Membuka jendela dialog (AlertDialog, DialogFragment). Penutupan sebagian Activity oleh Activity lain (misalnya, Activity transparan untuk otentikasi). Rotasi layar (Activity dibuat ulang, urutan: onPause → onStop → onDestroy → onCreate → onStart → onResume). Mode multi-window — jendela tidak aktif menerima onPause. Setiap peristiwa ini memerlukan penangguhan operasi yang membutuhkan banyak sumber daya untuk menghemat baterai dan kinerja.

swift
import UIKit

extension Notification.Name {
    static let systemInterruptionBegan = Notification.Name("systemInterruptionBegan")
    static let systemInterruptionEnded = Notification.Name("systemInterruptionEnded")
}

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func applicationWillResignActive(_ application: UIApplication) {
        // Aplikasi masuk ke Inactive — gangguan sistem
        print("Gangguan: Control Center, panggilan, atau peringatan sistem")

        // Penangguhan operasi yang sensitif terhadap waktu
        pauseVideoPlayback()
        stopContinuousDataCollection()
        hideSensitiveInformation()

        // Memberi tahu komponen
        NotificationCenter.default.post(name: .systemInterruptionBegan, object: nil)
    }

    // Kembali dari Inactive ke Active
    func applicationDidBecomeActive(_ application: UIApplication) {
        resumeVideoPlayback()
        restartDataCollection()
        NotificationCenter.default.post(name: .systemInterruptionEnded, object: nil)
    }

    private func pauseVideoPlayback() {
        // Menghentikan video agar suara tidak tumpang tindih
    }

    private func hideSensitiveInformation() {
        // Menyembunyikan data sensitif saat screenshot layar
        // Control Center/App Switcher mengambil screenshot UI
    }
}

Kode ini menunjukkan penanganan Inactive di UIKit. applicationWillResignActive menghentikan video, menghentikan pengumpulan data, dan menyembunyikan informasi sensitif. Ini penting karena saat membuka Control Center atau App Switcher, sistem mengambil screenshot UI saat ini — pengguna dapat melihat data rahasia di pratinjau. NotificationCenter memungkinkan komponen aplikasi untuk berlangganan peristiwa gangguan.

Inactive di iOS: Swift dan UIKit

Di iOS, Inactive ditangani oleh sepasang metode: applicationWillResignActive (masuk ke Inactive) dan applicationDidBecomeActive (kembali dari Inactive). Metode-metode ini adalah bagian dari UIApplicationDelegate dan dipanggil untuk setiap transisi melalui Inactive. Sejak iOS 13 dan UISceneDelegate, sceneWillResignActive dan sceneDidBecomeActive telah ditambahkan untuk skenario multi-window.

SceneDelegate dan Inactive multi-window

Di iPad dengan iOS 13+, aplikasi dapat memiliki beberapa adegan (jendela). Setiap adegan memiliki siklus hidupnya sendiri. Satu adegan dapat menjadi Inactive (pengguna telah beralih ke adegan lain), sementara yang lain tetap Active. Ini adalah perbedaan penting dibandingkan dengan iPhone, di mana Inactive adalah status global untuk seluruh aplikasi. Saat mengembangkan untuk iPad, Inactive harus ditangani secara terpisah untuk setiap adegan.

swift
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    // Adegan menjadi tidak aktif
    func sceneWillResignActive(_ scene: UIScene) {
        // Di iPad, adegan ini kehilangan fokus, tetapi yang lain mungkin aktif
        print("Adegan kehilangan aktivitas")

        // Penangguhan tugas adegan ini
        pauseSceneSpecificOperations()
    }

    // Adegan menjadi aktif
    func sceneDidBecomeActive(_ scene: UIScene) {
        print("Adegan telah menjadi aktif")
        resumeSceneSpecificOperations()
    }

    private func pauseSceneSpecificOperations() {
        // Penangguhan operasi khusus untuk adegan ini
    }

    private func resumeSceneSpecificOperations() {
        // Melanjutkan operasi saat fokus kembali
    }
}

// AppDelegate tetap menjadi titik masuk, mendelegasikan ke adegan
@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(
        _ application: UIApplication,
        configurationForConnecting connectingSceneSession: UISceneSession,
        options: UIScene.ConnectionOptions
    ) -> UISceneConfiguration {
        return UISceneConfiguration(
            name: "Default Configuration",
            sessionRole: connectingSceneSession.role
        )
    }
}

Kode ini menunjukkan SceneDelegate untuk menangani Inactive di tingkat adegan. sceneWillResignActive dipanggil ketika jendela tertentu kehilangan fokus — ini dapat terjadi saat beralih antar jendela di iPad. AppDelegate mengonfigurasi UISceneConfiguration untuk mendukung multi-window. Setiap adegan memiliki status independen dan pengembang harus menanganinya secara terpisah.

Inactive di Android: onPause dan visibilitas

Di Android, analog langsung dari iOS Inactive adalah metode onPause() dari siklus hidup Activity. Ini dipanggil ketika Activity kehilangan fokus input, tetapi mungkin tetap terlihat. Skenario tipikal: membuka jendela dialog, meluncurkan Activity lain di aplikasi yang sama, panggilan masuk, menekan tombol Home atau Recents. Di onPause, pengembang harus menangguhkan operasi yang membutuhkan banyak sumber daya — animasi, pemutaran video, bekerja dengan kamera.

Perbedaan penting Android — onPause selalu mendahului onStop, tetapi tidak sebaliknya. Activity dapat menerima onPause tanpa onStop (misalnya, saat membuka Activity transparan). Juga, onPause dapat dipanggil beberapa kali selama masa hidup Activity — pada setiap perubahan fokus. Jangan tempatkan logika satu kali di onPause — gunakan onStop untuk operasi final dan onPause hanya untuk menangguhkan tindakan interaktif.

kotlin
class VideoPlayerActivity : AppCompatActivity() {

    private var exoPlayer: ExoPlayer? = null
    private var currentPosition: Long = 0L

    override fun onPause() {
        super.onPause()
        // Aplikasi kehilangan fokus — hentikan video
        exoPlayer?.let { player ->
            if (player.isPlaying) {
                currentPosition = player.currentPosition
                player.pause()
            }
        }
        // Menyembunyikan data sensitif (GDPR/layar bank)
        if (window.decorView.systemUiVisibility and
            View.SYSTEM_UI_FLAG_SECURE == 0
        ) {
            hideSensitiveOverlay()
        }
    }

    override fun onResume() {
        super.onResume()
        // Fokus kembali — lanjutkan pemutaran
        exoPlayer?.seekTo(currentPosition)
        exoPlayer?.play()
        showSensitiveOverlay()
    }

    private fun hideSensitiveOverlay() {
        // Menempatkan layar hitam di atas data keuangan
    }
}

Kode ini menunjukkan penanganan onPause yang benar untuk pemutar video. ExoPlayer dijeda saat kehilangan fokus, dan posisi pemutaran disimpan. Saat kembali ke onResume, pemutar melanjutkan pemutaran dari posisi yang disimpan. Selain itu, pola penyembunyian data sensitif ditunjukkan — penting untuk aplikasi keuangan dan medis yang memerlukan perlindungan dari screenshot saat beralih.

Praktik terbaik penanganan Inactive

Aturan pertama — sembunyikan data rahasia saat transisi ke Inactive. Ketika pengguna membuka Control Center atau App Switcher, iOS mengambil screenshot layar saat ini. Di Android serupa — sistem menampilkan pratinjau Activity terakhir di Recents. Gunakan UIApplication.shouldSnapshotSecureApp (iOS 16+) atau FLAG_SECURE (Android) untuk melindungi layar rahasia.

Aturan kedua — hentikan animasi dan media. Inactive bukan waktu terbaik untuk memutar video atau animasi, karena pengguna tidak melihatnya. Lebih jauh, pemutaran di latar belakang dapat menyebabkan tumpang tindih suara dengan suara sistem (panggilan, notifikasi). Hentikan AVPlayer, ExoPlayer, dan UIView.animate saat transisi ke Inactive dan lanjutkan saat kembali ke Active.

Aturan ketiga — blokir input data. Jika aplikasi berisi formulir input atau draf, blokir keyboard dan bidang input saat transisi ke Inactive. Ini mencegah input yang tidak disengaja saat kembali dan melindungi dari penyadapan data melalui overlay sistem. Di iOS, nonaktifkan first responder (view.endEditing(true)), di Android — bersihkan fokus (currentFocus?.clearFocus()).

Aturan keempat — jangan lakukan operasi panjang di applicationWillResignActive atau onPause. Metode-metode ini harus selesai dalam sepersekian detik. Jika perlu menyimpan data dalam jumlah besar, mulailah penyimpanan di thread latar belakang dan selesaikan di applicationDidEnterBackground atau onStop. iOS memberikan 5 detik untuk menjalankan applicationWillResignActive, setelah itu sistem dapat menghentikan aplikasi secara paksa.

swift
import UIKit

final class SecureOverlayManager {
    private var blurView: UIVisualEffectView?

    func showBlurOverlay() {
        guard let window = UIApplication.shared.keyWindow,
              blurView == nil
        else { return }

        let blur = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
        blur.frame = window.bounds
        blur.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        window.addSubview(blur)
        blurView = blur
    }

    func removeBlurOverlay() {
        blurView?.removeFromSuperview()
        blurView = nil
    }
}

// Penggunaan di AppDelegate
func applicationWillResignActive(_ application: UIApplication) {
    SecureOverlayManager().showBlurOverlay()
}

func applicationDidBecomeActive(_ application: UIApplication) {
    SecureOverlayManager().removeBlurOverlay()
}

Kode ini menunjukkan implementasi overlay aman untuk melindungi data saat transisi ke Inactive. UIVisualEffectView dengan efek blur ditempatkan di atas seluruh UI saat transisi ke Inactive dan dihapus saat kembali ke Active. Ini menjamin bahwa data rahasia tidak akan terlihat di screenshot App Switcher dan Control Center. Demikian pula, UIImageView dengan logo dapat digunakan untuk overlay bermerek.

Pertanyaan yang Sering Diajukan

Apakah Inactive selalu mendahului Background?

Ya. Inactive adalah status perantara wajib sebelum transisi ke Background di iOS. Aplikasi tidak dapat beralih langsung dari Active ke Background — pertama menjadi Inactive, lalu Background. Di Android serupa: onPause selalu dipanggil sebelum onStop. Ini memberi pengembang kesempatan untuk menyiapkan data untuk disimpan sebelum sepenuhnya pergi ke latar belakang.

Bisakah aplikasi menerima Inactive tanpa gangguan?

Ya. Di iPad saat meluncurkan Slide Over atau Split View, adegan aktif menjadi Inactive, meskipun tidak ada gangguan sistem yang terjadi — pengguna hanya berinteraksi dengan adegan lain. Ini adalah fitur multi-window iPadOS. Di iPhone, Inactive selalu disebabkan oleh gangguan sistem — panggilan, notifikasi, Control Center atau Notification Center.

Berapa lama aplikasi bisa tetap di Inactive?

Biasanya antara 0,1 hingga 2 detik. Saat panggilan masuk dengan layar panggilan — hingga 30 detik (sampai pengguna menjawab atau menolak panggilan). iOS tidak membatasi waktu secara paksa di Inactive, tetapi sistem dapat menghentikan aplikasi jika tidak merespons peristiwa (watchdog). Di Android, onPause tidak memiliki batas waktu, tetapi disarankan untuk menyelesaikan pekerjaan dalam 200 ms.

Apa itu scenePhase di SwiftUI saat Inactive?

ScenePhase.inactive — nilai enum ScenePhase, diatur ketika adegan berada di latar depan tetapi tidak menerima peristiwa. Di SwiftUI, Anda dapat mengamatinya melalui @Environment(\.scenePhase) dan bereaksi melalui onChange. Saat transisi dari .active ke .inactive, hentikan timer dan animasi. Saat kembali ke .active — lanjutkan. Saat pergi ke .background — simpan status.

Apakah perlu menyembunyikan UI saat Inactive untuk semua aplikasi?

Tidak, hanya untuk aplikasi yang bekerja dengan data rahasia: perbankan, medis, perusahaan, messenger dengan obrolan pribadi. Untuk game dan aplikasi hiburan, menyembunyikan UI tidak diperlukan. Namun, menghentikan permainan dan suara saat Inactive adalah praktik yang baik untuk menghindari tumpang tindih suara dengan notifikasi sistem. Apple merekomendasikan menyembunyikan data sensitif, tetapi tidak mewajibkannya.

Ringkasan

  • Inactive — status transisi antara Active dan Background, aplikasi terlihat tetapi tidak interaktif
  • Penyebab — Control Center, Notification Center, panggilan masuk, izin sistem, Siri, Apple Pay
  • Penanganan iOS — applicationWillResignActive untuk menghentikan animasi, media, dan menyembunyikan data sensitif
  • SwiftUI — scenePhase .inactive melalui Environment, onChange untuk efek samping
  • Android — onPause sebagai analog, dengan dukungan multi-window dan penutupan sebagian Activity
  • Keamanan — overlay blur atau FLAG_SECURE untuk perlindungan dari screenshot App Switcher dan Control Center
  • Karakter sementara — Inactive berlangsung sampai gangguan berakhir, kemudian kembali ke Active atau pergi ke Background

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga