Mobile

React Native Background API dan Notification dengan Kotlin

admin
admin

8 Sep 2026 • 3 min baca

React Native Background API dan Notification dengan Kotlin

Ada kondisi di aplikasi mobile di mana API harus tetap dipanggil walaupun aplikasi tidak sedang dibuka.

Contohnya:

  • tracking lokasi
  • geofence
  • monitoring pekerjaan
  • update status
  • notifikasi background

Masalahnya, JavaScript React Native tidak selalu aktif ketika aplikasi berada di background atau sudah di-swipe dari recent apps.

Untuk kebutuhan seperti ini, sebagian proses perlu dipindahkan ke native Android.

Arsitektur

Arsitektur React Native background API, geofencing, BroadcastReceiver, dan notification

Pada implementasi geofence, alurnya kurang lebih seperti ini:

React Native / Expo
        ↓
Register Geofence
        ↓
Google GeofencingClient
        ↓
PendingIntent
        ↓
BroadcastReceiver
        ↓
Background API
        ↓
Notification

React Native hanya melakukan registrasi.

Setelah itu Android yang menangani event geofence.

1. Registrasi di Level OS

Geofence didaftarkan menggunakan Google Play Services:

Geofence.Builder()
    .setRequestId(id)
    .setCircularRegion(lat, lng, radius)
    .setTransitionTypes(
        Geofence.GEOFENCE_TRANSITION_ENTER or
        Geofence.GEOFENCE_TRANSITION_EXIT
    )
    .setExpirationDuration(Geofence.NEVER_EXPIRE)
    .build()

Yang menarik adalah penggunaan:

PendingIntent

Event tidak perlu menunggu JavaScript aktif.

Android dapat membangunkan `BroadcastReceiver` ketika terjadi transisi geofence.

2. Background API dari BroadcastReceiver

Ketika event diterima:

override fun onReceive(context: Context, intent: Intent) {
    val event = GeofencingEvent.fromIntent(intent)

    val pendingResult = goAsync()

    Thread {
        try {
            processEnterEvent(context, event)
        } finally {
            pendingResult.finish()
        }
    }.start()
}

`goAsync()` memberikan waktu tambahan kepada `BroadcastReceiver` untuk menyelesaikan pekerjaan background.

Di implementasi ini, native Android langsung melakukan request API seperti:

ENTER
 ↓
GET status
 ↓
POST tracking job
 ↓
POST notification
 ↓
Show notification

Jadi API tidak perlu melewati React Native terlebih dahulu.

3. Kenapa API Dipanggil dari Native?

Bayangkan aplikasi sudah di-swipe oleh user:

React Native
     X
   stopped

Kalau seluruh proses bergantung pada JS:

Geofence
   ↓
JS
   ↓
API

event bisa tidak tertangani sesuai kebutuhan.

Dengan native:

Geofence
   ↓
Android OS
   ↓
BroadcastReceiver
   ↓
API

OS menjadi pihak yang membangunkan proses ketika event terjadi.

4. Background Service

Untuk kebutuhan tracking yang membutuhkan proses lebih persisten, digunakan Foreground Service:

startForeground(
    NOTIFICATION_ID,
    notification,
    ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION
)

return START_STICKY

`START_STICKY` meminta Android untuk mencoba membuat kembali service ketika prosesnya dibunuh oleh sistem.

Namun ada konsekuensinya: Foreground Service wajib memiliki notification yang sedang aktif.

5. Dua Jenis Notification

Pada implementasi ini terdapat dua notification dengan fungsi berbeda.

Tracking Notification

.setOngoing(true)
.setPriority(NotificationCompat.PRIORITY_LOW)

Notification ini digunakan sebagai indikator bahwa tracking sedang berjalan.

Karena:

setOngoing(true)

notification tidak dapat di-swipe oleh user.

Notification akan hilang ketika foreground service dihentikan.

Alert Notification

Untuk event geofence digunakan notification biasa:

.setAutoCancel(true)
.setOngoing(false)
.setPriority(NotificationCompat.PRIORITY_HIGH)

Notification ini:

  • bisa di-swipe
  • hilang ketika diklik
  • bisa memiliki tombol `Hapus`
  • digunakan untuk memberi informasi bahwa event telah terjadi

6. Notification Action

Android juga memungkinkan notification memiliki action.

Contohnya:

.addAction(
    0,
    "Hapus",
    clearPendingIntent
)

Ketika user menekan `Hapus`, Android menjalankan `BroadcastReceiver` lain:

if (intent.action == CLEAR_NOTIFICATION) {
    notificationManager.cancel(notificationId)
}

Jadi tombol pada notification tidak harus membuka React Native.

7. SharedPreferences untuk Background Configuration

API membutuhkan informasi seperti:

apiUrl
authToken
email

Konfigurasi tersebut disimpan di native:

context
    .getSharedPreferences(
        "expo_geofence_config",
        MODE_PRIVATE
    )

Ini penting karena `BroadcastReceiver` harus bisa mendapatkan konfigurasi tanpa bergantung pada state React Native.

Kesimpulan

Background processing di React Native tidak selalu berarti menjalankan JavaScript di background.

Untuk kebutuhan tertentu, arsitektur yang lebih reliable adalah:

React Native
     ↓
Native Module
     ↓
Android OS
     ↓
BroadcastReceiver
     ↓
Background API
     ↓
Notification

React Native menangani UI dan konfigurasi, sedangkan Android menangani event background yang membutuhkan lifecycle OS.

Ketika aplikasi harus tetap bereaksi setelah JS tidak aktif, native layer bukan lagi optional – tetapi bagian dari arsitektur.

Artikel Terkait

(3)

Komentar

(0)

Komentar Anda akan dimoderasi.

Memuat komentar...