Belajar Mobile Developer - Background Tasks & Push Notifications
Episode 14 of 28

Belajar Mobile Developer - Background Tasks & Push Notifications

Menjalankan tugas latar belakang dan mengirim push notification: WorkManager & foreground services di Android, BGTask di iOS, FCM & APNs sebagai jalur pengiriman, serta pola deep link dari notifikasi untuk Fitku

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Aplikasi yang baik bukan hanya merespons — ia juga bekerja saat tidak dibuka. Di episode 14 ini kita belajar background tasks & push notifications: mengirim pengingat workout, menyinkronkan data di malam hari, dan menampilkan notifikasi dari server. Ini fitur yang sangat memengaruhi retensi pengguna, tapi juga salah satu area paling rumit karena kedua platform membatasi latar belakang dengan ketat.

Mengapa rumit? Karena OS membenci aplikasi yang menghabiskan baterai diam-diam. Android dan iOS punya kebijakan berbeda, dan melanggar batasannya berujung pada aplikasi dibunuh OS atau ditolak review store.

Push Notification: FCM & APNs

Push notification dikirim oleh server ke device, lewat layanan resmi platform:

  • FCM (Firebase Cloud Messaging) untuk Android — dan iOS (mem-forward ke APNs).
  • APNs (Apple Push Notification service) untuk iOS.
100%

Payload notifikasi membawa data + token device:

Payload FCM
{
  "to": "device_token",
  "notification": {
    "title": "Waktunya workout!",
    "body": "30 menit lari pagi terjadwal."
  },
  "data": {
    "route": "workout/42",
    "type": "reminder"
  }
}

Field data dipakai aplikasi untuk navigasi (deep link dari episode 12) — pengguna mengetuk notifikasi dan langsung dibuka ke layar yang tepat.

Notifikasi di Android

Menerima FCM

KotlinService FCM di Android
class FitkuMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(message: RemoteMessage) {
        message.data["route"]?.let { route ->
            // tampilkan notifikasi; saat di-tap → navigasi ke route
            showNotification(title, body, route)
        }
    }
}

Notification Channels

Android 8+ wajib memakai notification channels — pengguna bisa memilih mengatur jenis notifikasi:

KotlinNotification Channel
val channel = NotificationChannel(
    "workout_reminders",
    "Pengingat Workout",
    NotificationManager.IMPORTANCE_HIGH
).apply { description = "Pengingat jadwal workout harian" }
notificationManager.createNotificationChannel(channel)

Background Tasks di Android

WorkManager

WorkManager adalah API standar untuk pekerjaan deferred & guaranteed — sinkronisasi, upload, cleanup. Ia bertahan dari restart dan memilih waktu yang efisien:

KotlinWorkManager untuk sync
class SyncWork : Worker() {
    override fun doWork(): Result {
        return try {
            syncPendingWorkouts()
            Result.success()
        } catch (e: RetryableException) {
            Result.retry()
        }
    }
}
 
// Jadwalkan periodik (min 15 menit)
val request = PeriodicWorkRequestBuilder<SyncWork>(6, TimeUnit.HOURS)
    .setConstraints(Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .build())
    .build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
    "sync_workouts", ExistingPeriodicWorkPolicy.UPDATE, request
)

Foreground Service

Untuk tugas yang harus terus jalan dan terlihat (misal melacak lari GPS), gunakan foreground service dengan notifikasi persisten — berperilaku seperti "sedang aktif".

Warning

Android membatasi foreground service dengan izin & persyaratan tertentu (misal FOREGROUND_SERVICE_LOCATION untuk GPS). Jangan menyalahgunakan: service yang tidak sah akan dicabut OS. Sebagian besar kebutuhan sync cukup ditangani WorkManager.

Background Tasks di iOS

iOS jauh lebih ketat. Pilihan resmi:

  • BGTaskScheduler — pekerjaan latar belakang sceduled yang singkat (misal refresh data).
  • Silent push — pesan yang membangunkan app sebentar untuk fetch data.
  • URLSession background transfer — upload/download besar yang dikelola sistem.
BGAppRefreshTask di iOS
class AppRefreshScheduler {
    static func schedule() {
        let request = BGAppRefreshTaskRequest(identifier: "fitku.refresh")
        request.earliestBeginDate = Date(timeIntervalSinceNow: 3600) // 1 jam lagi
        try? BGTaskScheduler.shared.submit(request)
    }
}
 
func handleRefresh(task: BGAppRefreshTask) {
    task.expirationHandler = { /* batasi kerja saat hampir kadaluarsa */ }
    Task {
        await syncPendingWorkouts()
        task.setTaskCompleted(success: true)
    }
}

Aturan praktis iOS: lakukan sesedikit mungkin dalam waktu singkat. iOS memberi waktu terbatas sebelum app di-suspend.

Cross-Platform: Expo & Flutter

Expo (RN)

Notifikasi dengan expo-notifications
import * as Notifications from "expo-notifications";
 
export async function registerForPush() {
  const token = await Notifications.getExpoPushTokenAsync();
  await saveDeviceToken(token.data);
}
 
export async function sendReminderLocal() {
  await Notifications.scheduleNotificationAsync({
    content: { title: "Waktunya workout!", body: "30 menit lari pagi." },
    trigger: { type: Notifications.SchedulableTriggerInputTypes.DAILY, hour: 6, minute: 0 },
  });
}

Untuk background sync di Expo, gunakan expo-background-task atau EAS; untuk Flutter gunakan firebase_messaging + workmanager package.

Common Pitfalls Background & Push

  • Menganggap push itu realtime: push tidak dijamin urut/detik — pikirkan sebagai hint, bukan kanal data.
  • Foreground service tanpa kebutuhan jelas: OS akan membunuh; uji di berbagai versi Android.
  • Tidak handle tap notifikasi: pengguna mengetuk dan aplikasi blank karena route tidak diproses (episode 12).
  • Token device tidak di-rotate: setelah reinstal, token lama tetap dikirim — bersihkan saat gagal kirim.
  • Sinkronisasi tanpa constraint network/baterai: hemat data & baterai user.

Tip

Log semua fase notifikasi: kirim server → sampai FCM/APNs → tampil → di-tap. Ketika "notifikasi tidak muncul", 80% kasus karena payload salah, channel belum dibuat, atau device token kedaluwarsa. Instrumentasi menyelamatkan hari.

Penutup

Pada episode 14 ini, kalian telah menguasai latar belakang & notifikasi:

  • Push via FCM & APNs, dengan payload route untuk deep link (episode 12).
  • Android: WorkManager untuk deferred work, foreground service untuk tugas berkelanjutan.
  • iOS: BGTaskScheduler dengan kebijakan ketat — kerja singkat, hemat baterai.
  • Cross-platform: expo-notifications, firebase_messaging, workmanager.

Di episode 15 selanjutnya kita ukur kualitas aplikasi: Performance & Profiling — rendering jank, memory, battery, dan tools profiling untuk menemukan bottleneck di Fitku. Sampai jumpa!

Belajar Mobile Developer - Background Tasks & Push Notifications | Belajar Mobile Developer