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

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.
