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 — 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.
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).
| Karakteristik | iOS Inactive | Android onPause |
|---|---|---|
| UI terlihat | Ya | Ya (sebagian atau seluruhnya) |
| Peristiwa sentuhan | Tidak menerima | Tidak menerima |
| Durasi | Sampai gangguan berakhir | Sampai fokus kembali atau pergi ke latar belakang |
| Status berikutnya | Active atau Background | onResume atau onStop |
| Tingkat | Aplikasi (UIApplication) | Activity |
| Multi-window | Satu adegan aktif | Beberapa Activity dalam onPause |
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Baca juga