Anda di halaman 1dari 11

MODUL PRAKTIKUM

PEMROGRAMAN UNTUK
PERANGKAT BERGERAK 1

Indra Azimi, S.T., M.T.


Rizza Indah Mega Mandasari, S.Kom., M.T.
Cahyana S.T., M.Kom.

D3 Rekayasa Perangkat Lunak Aplikasi


Telkom University
Daftar Isi
Modul 14: Work in Background .................................................................................................................... 2

1. Overview ........................................................................................................................................... 2

2. Getting Started.................................................................................................................................. 3

3. Task ................................................................................................................................................... 4

3.1. Membuat proses di background ............................................................................................... 4

3.2. Membuat notification channel ................................................................................................. 6

3.3. Membuat notifikasi updater ..................................................................................................... 8

4. Summary ......................................................................................................................................... 10

5. Challenge......................................................................................................................................... 10
Modul 14: Work in Background
1. Overview
Di modul kali ini kita akan melanjutkan pengembangan aplikasi Galeri Hewan dari modul sebelumnya.
Kita akan menambahkan sebuah proses yang berjalan di background menggunakan WorkManager.
Proses background ini akan bertugas melakukan update data dan memberi tahu pengguna bahwa ada
data baru dengan menggunakan notifikasi. Berikut adalah screenshot aplikasi setelah praktikum..
Tidak ada perubahan pada tampilan utama.

Seperti biasa, kode aplikasi versi lengkapnya dapat kamu akses dari repository Github berikut ini:
https://github.com/indraazimi/galeri-hewan
2. Getting Started
Buka project Galeri Hewan dari modul 13 (Activity and Fragment Lifecycles). Fitur yang akan kita buat
sekarang tidak membutuhkan log dan timer dari modul minggu lalu. Daripada menghapus kode
tersebut secara manual, kita akan mengembalikan keadaan project ke modul sebelumnya, yaitu
Connect to the Internet. Klik menu Git > Branches… lalu pilih branch internet > Checkout.

Bukalah MainActivity dan MainFragment. Pastikan tidak ada lagi log di sana. Pastikan juga tidak ada
package util yang berisi kelas MyTimer. Jika sudah, klik menu Git > New Branches… Masukkan
“background” sebagai nama branch yang baru, lalu klik tombol Create.

Akan tercipta sebuah branch baru di project kita. Task-task pada modul harus dikerjakan di branch ini.

Dilarang keras untuk copy – paste kode dari modul/sumber lain!

Ngoding pelan-pelan akan membuat kamu lebih jago di masa depan.


Lakukan commit setiap selesai 1 sub-task. Selamat ngoding!
3. Task
3.1. Membuat proses di background
Di task ini, kita akan membuat sebuah proses yang berjalan di background dengan menggunakan
WorkManager. Sebagai langkah awal, tambahkan dependency berikut di app/build.gradle.

dependencies {
...
implementation 'androidx.work:work-runtime-ktx:2.5.0'
...
}

Selanjutnya, tambahkan kelas baru di package network. Klik kanan pada package tersebut, lalu beri
nama UpdateWorker. Kelas ini nanti akan kita isi dengan proses yang harus dilakukan di background.

Pertama, extend kelas Worker, lalu override method doWork. Berhubung masih task pertama, di sini
kita akan melakukan log saja. Sekedar untuk memastikan bahwa proses di background telah berhasil
dilakukan. Kode akhir dari kelas UpdateWorker seperti berikut.

class UpdateWorker(
context: Context,
workerParams: WorkerParameters
) : Worker(context, workerParams) {

override fun doWork(): Result {


Log.d("Worker", "Menjalankan proses background..")

return Result.success()
}
}
Selanjutnya, karena proses di background ini tidak ada kaitannya sama sekali dengan UI, maka kita
letakkan kode untuk menjalankan proses background tersebut di ViewModel. Tambahkan method
scheduleUpdate di MainViewModel seperti berikut.

class MainViewModel : ViewModel() {

...
fun getStatus(): LiveData<ApiStatus> = status

fun scheduleUpdater(app: Application) {


val request = OneTimeWorkRequestBuilder<UpdateWorker>()
.setInitialDelay(1, TimeUnit.MINUTES)
.build()

WorkManager.getInstance(app).enqueueUniqueWork(
"updater",
ExistingWorkPolicy.REPLACE,
request
)
}
}

Terakhir, panggillan method tersebut dari MainFragment seperti berikut.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {


super.onViewCreated(view, savedInstanceState)

viewModel.getData().observe(viewLifecycleOwner, { ... })

viewModel.getStatus().observe(viewLifecycleOwner, { ... })

viewModel.scheduleUpdater(requireActivity().application)
}

Jalankan aplikasi. Setelah selesai loading dan data hewan telah tampil, tutup aplikasi dengan menekan
tombol Back. Tekan tombol Recent App, lalu kill aplikasi Galeri Hewan dari memori. Tunggu sekitar
satu menit dan pastikan muncul log seperti di bawah. Jika sudah, lakukan commit sesuai judul task ini.
3.2. Membuat notification channel
Proses di background telah selesai diatur, sekarang saatnya kita membuat notification channel. Ini
diperlukan agar aplikasi kita dapat menampilkan notifikasi di Android 8 (Oreo) atau yang lebih baru.
Notification channel memiliki nama dan deskripsi yang dapat dibaca pengguna. Jadi sebagai langkah
awal, tambahkan teks berikut ke dalam strings.xml di folder res/values.

<resources>
<string name="app_name">Galeri Hewan</string>
<string name="message">%1$s diklik!</string>
<string name="koneksi_error">Koneksi error</string>

<string name="channel_name">Updater</string>
<string name="channel_desc">Update data hewan otomatis</string>
</resources>

Selanjutnya, buka kelas MainActivity, lalu tambahkan kode berikut.

class MainActivity : AppCompatActivity() {

companion object {
const val CHANNEL_ID = "updater"
}

override fun onCreate(savedInstanceState: Bundle?) {


super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {


val name = getString(R.string.channel_name)
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel(CHANNEL_ID, name, importance)
channel.description = getString(R.string.channel_desc)

val manager = getSystemService(Context.NOTIFICATION_SERVICE)


as NotificationManager
manager.createNotificationChannel(channel)
}
}
}

Pada kode di atas, terdapat sebuah percabangan (IF) agar pembuatan notification channel hanya akan
dilakukan jika smartphone yang menjalankan aplikasi minimal memiliki sistem operasi Android 8
(Oreo). Jika tidak, maka tidak dibuat notification channel.
Berhubung kita sudah memiliki ID untuk proses update, maka string hardcode yang ada di
MainViewModel dapat diganti menjadi seperti ini.

fun scheduleUpdater(app: Application) {


val request = OneTimeWorkRequestBuilder<UpdateWorker>()
.setInitialDelay(1, TimeUnit.MINUTES)
.build()

WorkManager.getInstance(app).enqueueUniqueWork(
"updater",
MainActivity.CHANNEL_ID,
ExistingWorkPolicy.REPLACE,
request
)
}

Jalankan aplikasi. Apakah notifikasinya muncul..?

Tentu saja tidak. Hehe.. Karena di task ini kita hanya membuat notification channel nya saja. Bukalah
setting aplikasi Galeri Hewan. Klik menu Notifikasi aplikasi, lalu pastikan ada kategori Updater di sana.

Jika sudah berhasil, silahkan lakukan commit dengan commit message sesuai dengan judul task ini.
3.3. Membuat notifikasi updater
Pada task kali ini, barulah kita akan membuat notifikasi. Notifikasi ini memiliki judul dan konten yang
akan dibaca oleh pengguna. Jadi tambahkan terlebih dahulu teks berikut di strings.xml

<resources>
<string name="app_name">Galeri Hewan</string>
<string name="message">%1$s diklik!</string>
<string name="koneksi_error">Koneksi error</string>

<string name="channel_name">Updater</string>
<string name="channel_desc">Update data hewan otomatis</string>
<string name="notif_title">Ada hewan baru!</string>
<string name="notif_text">Cek sekarang biar nggak penasaran..</string>
</resources>

Di situasi normal, proses update data di background akan dilakukan dalam 3 tahapan, yaitu:
1. Request data baru ke server melalui internet
2. Simpan data tersebut di database sebagai cache
3. Beri tahu pengguna ada data baru (kasi notifikasi)

Kebetulan langkah 1 sudah diajarkan di modul 12 (Connect to the Internet). Langkah 2 juga sudah
diajarkan di modul 9 (Data persistence Room). Jadi di modul ini kita akan langsung loncat ke langkah
terakhir.. Ubah kelas Update Worker menjadi seperti ini.

class UpdateWorker(...) : Worker(context, workerParams) {

private val notificationId = 44

override fun doWork(): Result {


val builder = NotificationCompat.Builder(applicationContext,
MainActivity.CHANNEL_ID)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle(applicationContext.getString(
R.string.notif_title))
.setContentText(applicationContext.getString(
R.string.notif_text))
.setPriority(NotificationCompat.PRIORITY_HIGH)
val manager = NotificationManagerCompat.from(applicationContext)
manager.notify(notificationId, builder.build())

return Result.success()
}
}
Jalankan aplikasi. Tunggu selesai loading dan data hewannya muncul. Setelah itu, tekan tombol Back.
Masuk ke Recent App dan kill aplikasi Galeri Hewan. Tunggulah sekitar 1 menit. Pastikan notifikasinya
muncul. Berikut screenshot yang diharapkan. Apakah sudah sama?

Sekarang coba klik notifikasi di atas. Tidak terjadi apa-apa, padahal kita ingin agar ketika pengguna
klik pada notifikasi, aplikasi Galeri Hewan langsung muncul. Oleh sebab itu, tambahkan kode berikut.

override fun doWork(): Result {


val intent = Intent(applicationContext, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_CLEAR_TASK
val pendingIntent = PendingIntent.getActivity(applicationContext,
0, intent, 0)

val builder = NotificationCompat.Builder(applicationContext,


MainActivity.CHANNEL_ID)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle(applicationContext.getString(
R.string.notif_title))
.setContentText(applicationContext.getString(
R.string.notif_text))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
val manager = NotificationManagerCompat.from(applicationContext)
manager.notify(notificationId, builder.build())

return Result.success()
}
Sekarang jalankan kembali aplikasi dan lakukan langkah yang sama seperti sebelumnya. Pastikan
notifikasi muncul dan ketika diklik, aplikasi Galeri Hewan muncul. Jika sudah, berarti aplikasi kita
sudah benar. Silahkan lakukan commit dengan commit message berupa judul dari task 3.3 ini,
kemudian push ke repository praktikum.

4. Summary
Pada modul kali ini kita telah mengetahui bagaimana cara melakukan pekerjaan di background.
Walaupun aplikasi telah di-clear pengguna dari Recent App, proses background tetap berjalan. Ini
kurang lebih sama seperti aplikasi perpesanan yang akan menampilkan notifikasi tertentu ketika ada
pesan baru masuk. Keren bukan?

5. Challenge
Cobalah untuk mengubah pemanggilan proses background dari 1x saja, menjadi secara periodik,
misalnya setiap hari. Coba juga tambahkan constraint seperti koneksi harus tersedia. Kamu juga bisa
melengkapi proses di background dengan melakukan langkah 1 dan 2 yang modul ini skip, yaitu
request data baru ke server melalui internet dan menyimpan data tersebut di database sebagai cache.

Anda mungkin juga menyukai