Pertemuan 14

Tiga Pahlawan
Di Belakang Layar 🦸‍♂️

Aplikasi yang bagus tidak mati ketika ditutup! Belajar membuat Service yang jalan di background, menangkap sinyal sistem dengan Broadcast Receiver, dan menyapa user lewat Notification!

1. Service (Pekerja Keras)

Kalau Activity itu seperti pelayan toko yang menjaga etalase (butuh layar/UI), maka Service adalah pekerja di gudang belakang yang tidak pernah kelihatan.

Service tidak memiliki UI (User Interface). Tugasnya menyelesaikan proses berdurasi lama. Walaupun kamu menekan tombol Home dan kembali ke layar awal HP, Service akan tetap bekerja!

Contoh Penggunaan Nyata:

  • Memutar musik (Spotify/Joox).
  • Mengunduh file besar di background.
  • Melacak GPS rute lari/sepeda (Strava).

Background vs Foreground Service

Background Service

Kerja diam-diam. Sistem Android seringkali "membunuhnya" jika HP butuh RAM karena dianggap tidak penting.

Foreground Service

Service VIP. Wajib memunculkan Notifikasi permanen di layar HP agar user tahu. Susah dibunuh oleh sistem Android.

2. Broadcast Receiver (Sang Satpam)

Pernahkah aplikasimu tiba-tiba menampilkan pop-up "Koneksi Terputus!" saat WiFi HP dimatikan? Atau layar berkedip saat baterai sisa 15%? Siapa yang memberi tahu aplikasi tentang kejadian itu? Jawabannya: Broadcast Receiver.

Sistem Siaran (Broadcasting)

Sistem operasi Android secara terus-menerus berteriak (siaran radio) mengabarkan kejadian penting: "Baterai mau habis!", "HP selesai Booting!", "Mode Pesawat aktif!".

Menangkap Siaran (Receiver)

Aplikasi kita bisa membuat class turunan BroadcastReceiver. Kita pasang 'antena' untuk mendengarkan topik tertentu. Saat topik itu disiarkan Android, aplikasi kita akan merespon!

3. Notification (Menyapa User)

Pemberitahuan (Push Notification) adalah cara aplikasi menyapa user yang sedang tidak membuka aplikasi tersebut. Ada sebuah aturan penting sejak Android versi 8.0 (Oreo) yang sering membuat bingung developer pemula:

Peringatan Keras: Notification Channel!

Sejak Android 8.0+, kamu WAJIB membuat NotificationChannel sebelum memunculkan notifikasi. Channel ini membiarkan user mengatur notifikasi mana yang berbunyi keras dan mana yang sunyi. Jika kamu lupa membuat Channel, notifikasimu tidak akan pernah muncul!

Izin Android 13 (Tiramisu)

Untuk Android versi 13 ke atas, memunculkan notifikasi kini dianggap berbahaya. Kamu harus menambahkan <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> di Manifest!

Kaitan Tiga Pilar dengan Activity Lifecycle

Pernah bertanya-tanya, apa hubungannya semua fitur background ini dengan siklus hidup Activity? Jawabannya: Sangat Erat! Mereka bertiga hidup dan mati berdasarkan fase Activity-mu.

Service: Sang Pemberontak

onCreate() / Click

Biasanya dihidupkan lewat Intent dari tombol (di UI) atau saat Activity baru lahir.

onDestroy()

Ajaib! Saat Activity mati/di-kill, Service TETAP HIDUP berjalan di background sampai dia memanggil stopSelf().

Receiver: Awas Bocor!

onResume()

Waktu yang tepat untuk mendaftarkan (pasang antena) registerReceiver agar siap mendengarkan sinyal.

onPause() / onStop()

WAJIB DICABUT! Gunakan unregisterReceiver. Jika kamu membiarkan antena terpasang saat aplikasi mati, akan terjadi Memory Leak (Kebocoran RAM)!

Notification: Jembatan UI

onStop()

Saat user pencet tombol Home, layar tertutup. Inilah saat yang tepat menembakkan Notifikasi "Aplikasi berjalan di latar...".

PendingIntent (Click)

Saat notifikasi diklik, ia akan memicu onRestart() atau onCreate(), membangunkan kembali sang Activity ke panggung utama!

4. Mega Simulator

Coba mainkan ketiga fitur background ini! Aktifkan Service, simulasikan kejadian baterai HP yang melemah (Broadcast), dan tembakkan Notifikasi dari sistem!

Panel Kontrol Fitur

1. Background Service

MATI

Meski layar kembali ke Home, musik/tugas tetap berjalan di latar belakang.

2. Broadcast Receiver

Memaksa Android menembakkan siaran radio (Intent) ke seluruh HP.

3. NotificationManager

Membangun notifikasi dan mengirimkannya ke Status Bar atas HP.

Pesan Baru Masuk! Baru saja

Halo, ini pesan dari NotificationManager! Coba klik aku.

12:00

My App

Music Service

Menunggu perintah...

Log Aplikasi (Receiver)

5. Bedah Kode Lengkap

Sesuai dengan Simulator di atas, ini adalah kode utuh yang siap dieksekusi di Android Studio. Perhatikan struktur pembuatan Notification Channel dan deklarasi Service di AndroidManifest!

AndroidManifest.xml

Wajib mendeklarasikan Izin Notifikasi (Android 13+) dan mendaftarkan kelas Service serta Receiver agar dikenali oleh sistem!

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.superapp">

    <!-- Izin memunculkan Notifikasi (Wajib untuk Android 13 / Tiramisu ke atas) -->
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.MyApp">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- DAFTARKAN SERVICE DI SINI -->
        <service android:name=".MusicService" />

        <!-- DAFTARKAN RECEIVER DI SINI (Contoh deteksi colokan charger) -->
        <receiver android:name=".PowerReceiver" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>

    </application>
</manifest>

6. Tugas Puncak: Alarm Palsu!

Pernah melihat pesan notifikasi WhatsApp "Sedang memeriksa pesan baru..." yang berjalan sendiri? Mari kita buat sistem serupa menggunakan gabungan Service dan Notification!

Misi Project Utama (Fake Sync App):

  1. Buat `MainActivity` dengan satu tombol bertuliskan "Mulai Sinkronisasi Data".
  2. Buat sebuah class `SyncService.java` (Turunan `Service`). Jangan lupa daftarkan di AndroidManifest!
  3. Ketika tombol diklik, jalankan `SyncService` tersebut menggunakan `startService()`.
  4. Di dalam `onStartCommand` milik Service, munculkan Toast: "Sinkronisasi dimulai di background...". Lalu, panggil NotificationManager untuk memunculkan notifikasi berjudul: "Data tersinkronisasi!".
  5. *(Tantangan Ekstra: Bisakah kamu menggunakan fungsi `Handler(Looper.getMainLooper()).postDelayed` di dalam Service agar notifikasinya baru muncul 5 detik setelah tombol diklik?)*