Class Activity adalah komponen penting aplikasi Android, dan cara
aktivitas diluncurkan dan disatukan adalah bagian mendasar dari model aplikasi platform. Tidak seperti paradigma pemrograman di mana aplikasi diluncurkan dengan
metode main, sistem Android memulai kode dalam instance Activity
dengan memanggil metode callback tertentu yang sesuai dengan tahapan
tertentu dari siklus prosesnya.
Dokumen ini memperkenalkan konsep aktivitas, dan memberikan beberapa panduan ringan tentang cara menangani aktivitas. Untuk informasi tambahan tentang praktik terbaik dalam merancang aplikasi, lihat Panduan untuk arsitektur aplikasi.
Konsep aktivitas
Pengalaman aplikasi seluler berbeda dengan desktop karena interaksi pengguna dengan aplikasi tidak selalu dimulai di tempat yang sama. Sebaliknya, perjalanan pengguna sering kali dimulai dengan cara yang tidak dapat diduga. Misalnya, jika membuka aplikasi email dari layar utama, Anda mungkin melihat daftar email. Sebaliknya, jika Anda menggunakan aplikasi media sosial yang kemudian meluncurkan aplikasi email, Anda dapat langsung membuka layar aplikasi email untuk menulis email.
Class Activity dirancang untuk memfasilitasi paradigma ini. Jika satu aplikasi memanggil aplikasi lainnya, aplikasi pemanggil akan memanggil aktivitas di aplikasi lain, bukan aplikasi sebagai keseluruhan atomik. Dengan cara ini, aktivitas berfungsi sebagai titik masuk untuk interaksi aplikasi dengan pengguna. Anda menerapkan aktivitas sebagai
subclass dari class Activity.
Aktivitas menyediakan jendela tempat aplikasi menggambar UI. Jendela tersebut biasanya mengisi layar, tetapi mungkin lebih kecil dari layar dan mengambang di atas jendela lain.
Biasanya, satu aktivitas dalam aplikasi ditetapkan sebagai aktivitas utama, yang merupakan layar pertama yang muncul saat pengguna meluncurkan aplikasi. Di aplikasi Compose modern, ini adalah satu-satunya aktivitas yang diperlukan, karena aktivitas ini menghosting composable dalam arsitektur aktivitas tunggal, bukan memiliki hierarki tampilan. Daripada aplikasi memiliki beberapa aktivitas untuk layar, composable dalam host aktivitas memiliki beberapa tujuan navigasi.
Untuk menggunakan aktivitas pada aplikasi, Anda harus mendaftarkan informasi tentang aktivitas tersebut dalam manifes aplikasi, dan sebaiknya pahami siklus proses aktivitas. Bagian selanjutnya dari dokumen ini akan membahas topik tersebut.
Mengonfigurasi manifes
Agar aplikasi dapat menggunakan aktivitas, Anda harus mendeklarasikan aktivitas dan beberapa atributnya dalam manifes.
Mendeklarasikan aktivitas
Untuk mendeklarasikan aktivitas, buka file manifes Anda dan tambahkan elemen <activity>
sebagai turunan dari elemen <application>. Contoh:
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
Atribut yang diperlukan untuk elemen ini adalah android:name, yang
menentukan nama class aktivitas. Anda juga dapat menambahkan atribut yang menentukan karakteristik aktivitas seperti label, ikon, atau tema UI. Untuk mengetahui informasi selengkapnya tentang atribut ini dan atribut lainnya, lihat <activity> elemen
dokumentasi referensi.
Mendeklarasikan filter intent
Filter intent adalah fitur yang sangat canggih pada platform Android. Fitur ini memberikan kemampuan untuk meluncurkan aktivitas berdasarkan tidak hanya pada permintaan eksplisit, tetapi juga permintaan implisit. Misalnya, permintaan eksplisit mungkin memberitahukan sistem untuk "Memulai aktivitas Kirim Email pada aplikasi Gmail". Sebaliknya, permintaan implisit memberi tahu sistem untuk "Memulai layar Kirim Email dalam aktivitas apa pun yang dapat melakukan tugas". Saat UI sistem bertanya kepada pengguna aplikasi mana yang harus digunakan dalam menjalankan tugas, itu adalah filter intent yang bekerja.
Anda dapat memanfaatkan fitur ini dengan mendeklarasikan <intent-filter>
atribut pada <activity> elemen. Definisi elemen ini
mencakup elemen <action> dan, secara opsional, elemen <category>
dan/atau elemen <data>. Elemen ini digabungkan untuk menentukan jenis intent yang dapat ditanggapi aktivitas Anda. Misalnya, cuplikan kode berikut menunjukkan cara mengonfigurasi aktivitas yang mengirim data teks dan email, serta menerima permintaan dari aktivitas lain untuk melakukannya:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mailto" />
</intent-filter>
</activity>
Dalam contoh ini, elemen <action> menetapkan bahwa aktivitas ini mengirimkan
data. Mendeklarasikan elemen <category> sebagai DEFAULT akan memungkinkan aktivitas
untuk menerima permintaan peluncuran. Elemen <data> menentukan jenis
data yang dapat dikirimkan oleh aktivitas ini. Cuplikan kode berikut menunjukkan cara memanggil aktivitas yang dijelaskan di atas untuk menulis email:
fun composeEmail(addresses: Array<String>, subject: String) {
val intent = Intent(Intent.ACTION_SENDTO).apply {
data = Uri.parse("mailto:") // Only email apps handle this.
putExtra(Intent.EXTRA_EMAIL, addresses)
putExtra(Intent.EXTRA_SUBJECT, subject)
}
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}
}
Jika ingin agar aplikasi Anda mandiri dan tidak mengizinkan aplikasi lain untuk mengaktifkan aktivitasnya, Anda tidak perlu filter intent lainnya. Aktivitas yang tidak ingin Anda sediakan untuk aplikasi lain seharusnya tidak memiliki filter intent, dan Anda dapat memulainya sendiri dengan intent eksplisit. Untuk mengetahui informasi selengkapnya tentang cara aktivitas Anda dapat merespons intent, lihat Intent dan filter intent.
Menangani intent yang masuk
Contoh berikut menunjukkan pola untuk mengelola siklus proses aktivitas saat menangani beberapa jenis intent: berbagi teks tunggal, gambar tunggal, dan beberapa array gambar. Dengan merutekan berbagai input ini melalui fungsi terpusat
handleIntent, tindakan ini memastikan bahwa tindakan ACTION_SEND dan
ACTION_SEND_MULTIPLE diuraikan dan didelegasikan dengan benar ke
ViewModel untuk update UI reaktif.
class ExampleActivity : ComponentActivity() {
private val viewModel: MyViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handleIntent(intent)
setContent {
ComposeApp(viewModel)
}
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
when (intent?.action) {
Intent.ACTION_SEND -> {
if ("text/plain" == intent.type) {
intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
viewModel.handleText(it) // Update UI to reflect text being shared
}
} else if (intent.type?.startsWith("image/") == true) {
(intent.getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java))?.let {
viewModel.handleImage(it) // Update UI to reflect image being shared
}
}
}
Intent.ACTION_SEND_MULTIPLE -> {
if (intent.type?.startsWith("image/") == true) {
intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM, Uri::class.java)?.let {
viewModel.handleMultipleImages(it) // Update UI to reflect multiple images being shared
}
} else {
// Handle other types
}
}
else -> {
// Handle other intents
}
}
}
}
Mendeklarasikan izin
Anda dapat menggunakan tag <activity> manifes untuk mengontrol aplikasi mana yang dapat memulai
aktivitas tertentu. Aktivitas induk tidak dapat meluncurkan aktivitas turunan kecuali jika kedua aktivitas tersebut memiliki izin yang sama dalam manifesnya. Jika Anda mendeklarasikan elemen
<uses-permission> untuk aktivitas induk, setiap aktivitas turunan
harus memiliki elemen <uses-permission> yang sesuai.
Misalnya, jika aplikasi Anda ingin menggunakan aplikasi hipotetis bernama SocialApp untuk berbagi postingan di media sosial, SocialApp sendiri harus menentukan izin yang harus dimiliki aplikasi yang memanggilnya:
<manifest>
<activity android:name="...."
android:permission="com.google.socialapp.permission.SHARE_POST"
/>
Kemudian, agar diizinkan memanggil SocialApp, aplikasi Anda harus cocok dengan izin yang disetel di manifes SocialApp:
<manifest>
<uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>
Untuk mengetahui informasi selengkapnya tentang izin dan keamanan secara umum, lihat Checklist keamanan.
Mengelola siklus hidup aktivitas
Selama masa siklusnya berjalan, aktivitas melalui beberapa status. Anda menggunakan serangkaian callback untuk menangani transisi antar-status. Bagian berikut memperkenalkan callback ini. Di aplikasi Compose, sebaiknya jangan langsung menghubungkan ke callback ini. Sebagai gantinya, gunakan Lifecycle API untuk mengamati perubahan status. Untuk mengetahui informasi selengkapnya, lihat Mengintegrasikan siklus proses dengan Compose.
onCreate
Anda harus menerapkan callback ini, yang diaktifkan saat sistem membuat aktivitas Anda. Implementasi Anda harus menginisialisasi komponen penting dari aktivitas Anda: Misalnya, aplikasi harus membuat tampilan dan menautkan data ke daftar di sini.
Di aplikasi Compose, gunakan callback ini untuk menyiapkan composable host menggunakan setContent, seperti ditunjukkan di bawah ini:
class MyActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Text(text = stringResource(id = R.string.greeting))
}
}
}
Setelah onCreate selesai, callback berikutnya selalu onStart.
onStart
Saat onCreate keluar, aktivitas memasuki status Dimulai, dan
aktivitas menjadi terlihat oleh pengguna. Callback ini merupakan persiapan akhir aktivitas untuk dikirim ke latar depan dan menjadi interaktif.
onResume
Sistem memanggil callback ini sebelum aktivitas mulai berinteraksi dengan pengguna. Pada tahap ini, aktivitas berada di bagian atas tumpukan aktivitas, dan mencatat semua input pengguna. Sebagian besar fungsi inti aplikasi diimplementasikan
dalam metode onResume.
Callback onPause selalu mengikuti onResume.
onPause
Sistem memanggil onPause saat aktivitas kehilangan fokus dan memasuki status
Dijeda. Status ini terjadi ketika, misalnya, pengguna mengetuk tombol Kembali atau Terbaru. Saat sistem memanggil onPause untuk aktivitas Anda, secara teknis berarti aktivitas Anda masih terlihat sebagian, tetapi yang paling sering adalah indikasi bahwa pengguna meninggalkan aktivitas, dan aktivitas tersebut akan segera memasuki status Berhenti atau Dilanjutkan.
Aktivitas dalam status Dijeda dapat terus mengupdate UI jika pengguna mengharapkan UI untuk diupdate. Contoh aktivitas tersebut mencakup salah satu yang menampilkan layar peta navigasi atau pemutar media yang sedang diputar. Bahkan jika aktivitas tersebut kehilangan fokus, pengguna mengharapkan UI untuk melanjutkan update.
Anda tidak perlu menggunakan onPause untuk menyimpan aplikasi atau data pengguna, melakukan
panggilan jaringan, atau menjalankan transaksi database. Untuk mengetahui informasi tentang cara menyimpan
data, lihat Menyimpan dan memulihkan status UI sementara.
Setelah onPause selesai dijalankan, callback berikutnya adalah
onStop atau onResume, bergantung pada apa yang terjadi setelah aktivitas
memasuki status Dijeda.
onStop
Sistem memanggil onStop saat aktivitas tidak lagi terlihat oleh
pengguna. Hal ini dapat terjadi karena aktivitas diakhiri, aktivitas baru dimulai, atau aktivitas yang ada memasuki status Dilanjutkan dan menutupi aktivitas yang dihentikan. Dalam semua kasus ini, aktivitas yang dihentikan tidak lagi terlihat sama sekali.
Callback berikutnya yang dipanggil oleh sistem adalah onRestart, jika
aktivitas akan kembali berinteraksi dengan pengguna, atau onDestroy jika
aktivitas ini benar-benar dihentikan.
onRestart
Sistem memanggil callback ini jika aktivitas dalam status Berhenti akan dimulai ulang. onRestart memulihkan status aktivitas pada waktu ketika aktivitas dihentikan.
Callback ini selalu diikuti oleh onStart.
onDestroy
Sistem memanggil callback ini sebelum aktivitas diakhiri.
Callback ini adalah panggilan terakhir yang diterima aktivitas. onDestroy biasanya diterapkan untuk memastikan bahwa semua resource aktivitas akan dilepas jika aktivitas atau proses yang berisi callback tersebut diakhiri.
Bagian ini hanya memberikan pengenalan tentang topik ini. Untuk penanganan siklus hidup aktivitas dan callback-nya yang lebih mendetail, lihat Siklus hidup aktivitas.