1 page.title=Aktivitas 2 page.tags=aktivitas,intent 3 @jd:body 4 5 <div id="qv-wrapper"> 6 <div id="qv"> 7 <h2>Dalam dokumen ini</h2> 8 <ol> 9 <li><a href="#Creating">Membuat Aktivitas</a> 10 <ol> 11 <li><a href="#UI">Mengimplementasikan antarmuka pengguna</a></li> 12 <li><a href="#Declaring">Mendeklarasikan aktivitas dalam manifes</a></li> 13 </ol> 14 </li> 15 <li><a href="#StartingAnActivity">Memulai Aktivitas</a> 16 <ol> 17 <li><a href="#StartingAnActivityForResult">Memulai aktivitas agar berhasil</a></li> 18 </ol> 19 </li> 20 <li><a href="#ShuttingDown">Mematikan Aktivitas</a></li> 21 <li><a href="#Lifecycle">Mengelola Daur Hidup Aktivitas</a> 22 <ol> 23 <li><a href="#ImplementingLifecycleCallbacks">Mengimplementasikan callback daur hidup</a></li> 24 <li><a href="#SavingActivityState">Menyimpan status aktivitas</a></li> 25 <li><a href="#ConfigurationChanges">Menangani perubahan konfigurasi</a></li> 26 <li><a href="#CoordinatingActivities">Mengoordinasikan aktivitas</a></li> 27 </ol> 28 </li> 29 </ol> 30 31 <h2>Kelas-kelas utama</h2> 32 <ol> 33 <li>{@link android.app.Activity}</li> 34 </ol> 35 36 <h2>Lihat juga</h2> 37 <ol> 38 <li><a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tugas dan 39 Back-Stack</a></li> 40 </ol> 41 42 </div> 43 </div> 44 45 46 47 <p>{@link android.app.Activity} adalah sebuah komponen aplikasi yang menyediakan layar yang digunakan 48 pengguna untuk berinteraksi guna melakukan sesuatu, misalnya memilih nomor telepon, mengambil foto, mengirim email, atau 49 menampilkan peta. Tiap aktivitas diberi sebuah jendela untuk menggambar antarmuka penggunanya. Jendela ini 50 biasanya mengisi layar, namun mungkin lebih kecil daripada layar dan mengambang di atas 51 jendela lain.</p> 52 53 <p> Sebuah aplikasi biasanya terdiri atas beberapa aktivitas yang terikat secara longgar 54 satu sama lain. Biasanya, satu aktivitas dalam aplikasi ditetapkan sebagai aktivitas "utama", yang 55 ditampilkan kepada pengguna saat membuka aplikasi untuk pertama kali. Tiap 56 aktivitas kemudian bisa memulai aktivitas lain untuk melakukan berbagai tindakan. Tiap kali 57 aktivitas baru dimulai, aktivitas sebelumnya akan dihentikan, namun sistem mempertahankan aktivitas 58 dalam sebuah tumpukan ("back-stack"). Bila sebuah aktivitas baru dimulai, aktivitas itu akan didorong ke atas back-stack dan 59 mengambil fokus pengguna. Back-stack mematuhi mekanisme dasar tumpukan "masuk terakhir, keluar pertama", 60 jadi, bila pengguna selesai dengan aktivitas saat ini dan menekan tombol <em>Back</em>, aktivitas 61 akan dikeluarkan dari tumpukan (dan dimusnahkan) dan aktivitas sebelumnya akan dilanjutkan. (Back-stack 62 dibahas selengkapnya dalam dokumen <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tugas 63 dan Back-Stack</a>.)</p> 64 65 <p>Bila aktivitas dihentikan karena ada aktivitas baru yang dimulai, aktivitas lama akan diberi tahu tentang perubahan status ini 66 melalui metode callback daur hidupnya. 67 Ada beberapa metode callback yang mungkin diterima aktivitas, karena sebuah perubahan dalam 68 statusnya—apakah sistem sedang membuatnya, menghentikannya, melanjutkannya, atau menghapuskannya—dan 69 masing-masing callback memberi Anda kesempatan melakukan pekerjaan tertentu yang 70 sesuai untuk perubahan status itu. Misalnya, bila dihentikan, aktivitas Anda harus melepas 71 objek besar, seperti koneksi jaringan atau database. Bila aktivitas dilanjutkan, Anda bisa 72 memperoleh kembali sumber daya yang diperlukan dan melanjutkan tindakan yang terputus. Transisi status ini 73 semuanya bagian dari daur hidup aktivitas.</p> 74 75 <p>Bagian selebihnya dari dokumen ini membahas dasar-dasar cara membuat dan menggunakan aktivitas, 76 yang meliputi satu pembahasan lengkap tentang cara kerja daur hidup aktivitas, sehingga Anda bisa dengan benar mengelola 77 transisi di antara berbagai status aktivitas.</p> 78 79 80 81 <h2 id="Creating">Membuat Aktivitas</h2> 82 83 <p>Untuk membuat sebuah aktivitas, Anda harus membuat subkelas {@link android.app.Activity} (atau 84 subkelasnya yang ada). Dalam subkelas itu, Anda perlu mengimplementasikan metode-metode callback yang 85 dipanggil sistem saat aktivitas bertransisi di antara berbagai status daur hidupnya, misalnya saat 86 aktivitas sedang dibuat, dihentikan, dilanjutkan, atau dimusnahkan. Dua metode callback 87 terpenting adalah:</p> 88 89 <dl> 90 <dt>{@link android.app.Activity#onCreate onCreate()}</dt> 91 <dd>Anda harus mengimplementasikan metode ini. Sistem memanggilnya saat membuat 92 aktivitas Anda. Dalam implementasi, Anda harus menginisialisasi komponen-komponen esensial 93 aktivitas. 94 Yang terpenting, inilah tempat Anda harus memanggil {@link android.app.Activity#setContentView 95 setContentView()} untuk mendefinisikan layout untuk antarmuka pengguna aktivitas.</dd> 96 <dt>{@link android.app.Activity#onPause onPause()}</dt> 97 <dd>Sistem memanggil metode ini sebagai pertanda pertama bahwa pengguna sedang meninggalkan 98 aktivitas Anda (walau itu tidak selalu berarti aktivitas sedang dimusnahkan). Inilah biasanya tempat Anda 99 harus mengikat setiap perubahan yang harus dipertahankan selepas sesi pengguna saat ini (karena 100 pengguna mungkin tidak kembali).</dd> 101 </dl> 102 103 <p>Ada beberapa metode callback daur hidup lainnya yang harus Anda gunakan untuk memberikan 104 pengalaman pengguna yang mengalir di antara aktivitas dan menangani interupsi tidak terduga yang menyebabkan aktivitas Anda 105 dihentikan dan bahkan dimusnahkan. Semua metode callback daur hidup akan dibahas nanti, di 106 bagian tentang <a href="#Lifecycle">Mengelola Daur Hidup Aktivitas</a>.</p> 107 108 109 110 <h3 id="UI">Mengimplementasikan antarmuka pengguna</h3> 111 112 <p> Antarmuka pengguna aktivitas disediakan oleh hierarki objek—tampilan yang diturunkan 113 dari kelas {@link android.view.View}. Tiap tampilan mengontrol sebuah ruang persegi panjang tertentu 114 dalam jendela aktivitas dan bisa merespons interaksi pengguna. Misalnya, sebuah tampilan mungkin berupa sebuah 115 tombol yang mengawali suatu tindakan bila pengguna menyentuhnya.</p> 116 117 <p>Android menyediakan sejumlah tampilan siap-dibuat yang bisa Anda gunakan untuk mendesain dan mengatur 118 layout. "Widget" adalah tampilan yang menyediakan elemen-elemen visual (dan interaktif) untuk layar, 119 misalnya tombol, bidang teks, kotak cek, atau sekadar sebuah gambar. "Layout" adalah tampilan yang diturunkan dari {@link 120 android.view.ViewGroup} yang memberikan sebuah model layout unik untuk tampilan anaknya, misalnya 121 layout linier, layout grid, atau layout relatif. Anda juga bisa mensubkelaskan kelas-kelas {@link android.view.View} dan 122 {@link android.view.ViewGroup} (atau subkelas yang ada) untuk membuat widget dan 123 layout Anda sendiri dan menerapkannya ke layout aktivitas Anda.</p> 124 125 <p>Cara paling umum untuk mendefinisikan layout dengan menggunakan tampilan adalah dengan file layout XML yang disimpan dalam 126 sumber daya aplikasi Anda. Dengan cara ini, Anda bisa memelihara desain antarmuka pengguna Anda secara terpisah dari 127 kode yang mendefinisikan perilaku aktivitas. Anda bisa mengatur layout sebagai UI 128 aktivitas Anda dengan {@link android.app.Activity#setContentView(int) setContentView()}, dengan meneruskan 129 ID sumber daya untuk layout itu. Akan tetapi, Anda juga bisa membuat {@link android.view.View} baru dalam 130 kode aktivitas dan membuat hierarki tampilan dengan menyisipkan {@link 131 android.view.View} baru ke dalam {@link android.view.ViewGroup}, kemudian menggunakan layout itu dengan meneruskan akar 132 {@link android.view.ViewGroup} ke {@link android.app.Activity#setContentView(View) 133 setContentView()}.</p> 134 135 <p>Untuk informasi tentang cara membuat antarmuka pengguna, lihat dokumentasi <a href="{@docRoot}guide/topics/ui/index.html">Antarmuka Pengguna</a>.</p> 136 137 138 139 <h3 id="Declaring">Mendeklarasikan aktivitas dalam manifes</h3> 140 141 <p>Anda harus mendeklarasikan aktivitas dalam file manifes agar file itu 142 bisa diakses oleh sistem. Untuk mendeklarasikan aktivitas, bukalah file manifes Anda dan tambahkan sebuah elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> 143 sebagai anak elemen <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a> 144 . Misalnya:</p> 145 146 <pre> 147 <manifest ... > 148 <application ... > 149 <activity android:name=".ExampleActivity" /> 150 ... 151 </application ... > 152 ... 153 </manifest > 154 </pre> 155 156 <p>Ada beberapa atribut lain yang bisa Anda sertakan dalam elemen ini, untuk mendefinisikan properti 157 misalnya label untuk aktivitas, ikon untuk aktivitas, atau tema untuk memberi gaya ke 158 UI aktivitas. Atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#nm">{@code android:name}</a> 159 adalah satu-satunya atribut yang diperlukan—atribut ini menetapkan nama kelas aktivitas. Setelah 160 Anda mempublikasikan aplikasi, Anda tidak boleh mengubah nama ini, karena jika melakukannya, Anda bisa merusak 161 sebagian fungsionalitas, misalnya pintasan aplikasi (bacalah posting blog berjudul <a href="http://android-developers.blogspot.com/2011/06/things-that-cannot-change.html">Things 162 That Cannot Change</a>).</p> 163 164 <p>Lihat acuan elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> 165 untuk informasi selengkapnya tentang cara mendeklarasikan aktivitas Anda dalam manifes.</p> 166 167 168 <h4>Menggunakan filter intent</h4> 169 170 <p>Elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code 171 <activity>}</a> juga bisa menetapkan berbagai filter intent—dengan menggunakan elemen <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code 172 <intent-filter>}</a> —untuk mendeklarasikan cara komponen aplikasi lain 173 mengaktifkannya.</p> 174 175 <p>Bila Anda membuat aplikasi baru dengan Android SDK Tools, aktivitas stub 176 yang dibuat untuk Anda secara otomatis menyertakan filter intent yang mendeklarasikan respons 177 aktivitas pada tindakan "main" (utama) dan harus diletakkan dalam kategori "launcher"). Filter intent 178 terlihat seperti ini:</p> 179 180 <pre> 181 <activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> 182 <intent-filter> 183 <action android:name="android.intent.action.MAIN" /> 184 <category android:name="android.intent.category.LAUNCHER" /> 185 </intent-filter> 186 </activity> 187 </pre> 188 189 <p>Elemen <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code 190 <action>}</a> menetapkan bahwa ini adalah titik masuk "main" ke aplikasi. Elemen <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code 191 <category>}</a> menetapkan bahwa aktivitas ini harus tercantum dalam launcher aplikasi 192 sistem (untuk memungkinkan pengguna meluncurkan aktivitas ini).</p> 193 194 <p>Jika Anda bermaksud agar aplikasi dimuat dengan sendirinya dan tidak memperbolehkan aplikasi lain 195 mengaktifkan aktivitasnya, maka Anda tidak memerlukan filter intent lain. Hanya satu aktivitas yang boleh 196 memiliki tindakan "main" dan kategori "launcher", seperti dalam contoh sebelumnya. Aktivitas yang 197 tidak ingin Anda sediakan untuk aplikasi lain tidak boleh memiliki filter intent dan Anda bisa 198 memulai sendiri aktivitas dengan menggunakan intent secara eksplisit (seperti dibahas di bagian berikut).</p> 199 200 <p>Akan tetapi, jika ingin aktivitas Anda merespons intent implisit yang dikirim dari 201 aplikasi lain (dan aplikasi Anda sendiri), maka Anda harus mendefinisikan filter intent tambahan untuk 202 aktivitas. Untuk masing-masing tipe intent yang ingin direspons, Anda harus menyertakan sebuah <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code 203 <intent-filter>}</a> yang menyertakan elemen 204 <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code 205 <action>}</a> dan, opsional, sebuah elemen <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code 206 <category>}</a> dan/atau elemen <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code 207 <data>}</a>. Elemen-elemen ini menetapkan tipe intent yang bisa 208 direspons oleh aktivitas Anda.</p> 209 210 <p>Untuk informasi selengkapnya tentang cara aktivitas Anda merespons intent, lihat dokumen <a href="{@docRoot}guide/components/intents-filters.html">Intent dan Filter Intent</a>. 211 </p> 212 213 214 215 <h2 id="StartingAnActivity">Memulai Aktivitas</h2> 216 217 <p>Anda bisa memulai aktivitas lain dengan memanggil {@link android.app.Activity#startActivity 218 startActivity()}, dengan meneruskan sebuah {@link android.content.Intent} yang menjelaskan aktivitas 219 yang ingin Anda mulai. Intent menetapkan aktivitas persis yang ingin Anda mulai atau menjelaskan 220 tipe tindakan yang ingin Anda lakukan (dan sistem akan memilih aktivitas yang sesuai untuk Anda, 221 yang bahkan 222 bisa berasal dari aplikasi berbeda). Intent juga bisa membawa sejumlah kecil data untuk 223 digunakan oleh aktivitas yang dimulai.</p> 224 225 <p>Saat bekerja dalam aplikasi sendiri, Anda nanti akan sering meluncurkan aktivitas yang dikenal saja. 226 Anda bisa melakukannya dengan membuat intent yang mendefinisikan secara eksplisit aktivitas yang ingin Anda mulai, 227 dengan menggunakan nama kelas. Misalnya, beginilah cara satu aktivitas memulai aktivitas lain bernama {@code 228 SignInActivity}:</p> 229 230 <pre> 231 Intent intent = new Intent(this, SignInActivity.class); 232 startActivity(intent); 233 </pre> 234 235 <p>Akan tetapi, aplikasi Anda mungkin juga perlu melakukan beberapa tindakan, misalnya mengirim email, 236 pesan teks, atau pembaruan status, dengan menggunakan data dari aktivitas Anda. Dalam hal ini, aplikasi Anda mungkin 237 tidak memiliki aktivitasnya sendiri untuk melakukan tindakan tersebut, sehingga Anda bisa memanfaatkan aktivitas 238 yang disediakan oleh aplikasi lain pada perangkat, yang bisa melakukan tindakan itu untuk Anda. Inilah saatnya 239 intent benar-benar berharga—Anda bisa membuat intent yang menjelaskan tindakan yang ingin 240 dilakukan dan sistem 241 akan meluncurkan aktivitas yang tepat dari aplikasi lain. Jika ada 242 beberapa aktivitas yang bisa menangani intent itu, pengguna bisa memilih aktivitas yang akan digunakan. Misalnya, 243 jika Anda ingin memperbolehkan pengguna mengirim pesan email, Anda bisa membuat 244 intent berikut:</p> 245 246 <pre> 247 Intent intent = new Intent(Intent.ACTION_SEND); 248 intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); 249 startActivity(intent); 250 </pre> 251 252 <p>Ekstra {@link android.content.Intent#EXTRA_EMAIL} yang ditambahkan ke intent adalah sebuah larik string 253 alamat email yang menjadi tujuan pengiriman email. Bila aplikasi email merespons intent ini, 254 aplikasi itu akan membaca larik string yang disediakan dalam ekstra dan meletakkannya dalam bidang "to" 255 pada formulir penulisan email. Dalam situasi ini, aktivitas aplikasi email dimulai dan bila 256 pengguna selesai, aktivitas Anda akan dilanjutkan.</p> 257 258 259 260 261 <h3 id="StartingAnActivityForResult">Memulai aktivitas agar berhasil</h3> 262 263 <p>Kadang-kadang, Anda mungkin ingin menerima hasil dari aktivitas yang Anda mulai. Dalam hal itu, 264 mulailah aktivitas dengan memanggil {@link android.app.Activity#startActivityForResult 265 startActivityForResult()} (sebagai ganti {@link android.app.Activity#startActivity 266 startActivity()}). Untuk menerima hasil dari 267 aktivitas selanjutnya nanti, implementasikan metode callback {@link android.app.Activity#onActivityResult onActivityResult()} 268 . Bila aktivitas selanjutnya selesai, aktivitas akan mengembalikan hasil dalam {@link 269 android.content.Intent} kepada metode {@link android.app.Activity#onActivityResult onActivityResult()} 270 Anda.</p> 271 272 <p>Misalnya, mungkin Anda ingin pengguna mengambil salah satu kontaknya, sehingga aktivitas Anda bisa 273 melakukan sesuatu dengan informasi dalam kontak itu. Begini caranya membuat intent tersebut dan 274 menangani hasilnya:</p> 275 276 <pre> 277 private void pickContact() { 278 // Create an intent to "pick" a contact, as defined by the content provider URI 279 Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); 280 startActivityForResult(intent, PICK_CONTACT_REQUEST); 281 } 282 283 @Override 284 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 285 // If the request went well (OK) and the request was PICK_CONTACT_REQUEST 286 if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) { 287 // Perform a query to the contact's content provider for the contact's name 288 Cursor cursor = getContentResolver().query(data.getData(), 289 new String[] {Contacts.DISPLAY_NAME}, null, null, null); 290 if (cursor.moveToFirst()) { // True if the cursor is not empty 291 int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME); 292 String name = cursor.getString(columnIndex); 293 // Do something with the selected contact's name... 294 } 295 } 296 } 297 </pre> 298 299 <p>Contoh ini menunjukkan logika dasar yang harus Anda gunakan dalam metode {@link 300 android.app.Activity#onActivityResult onActivityResult()} Anda untuk menangani 301 hasil aktivitas. Syarat pertama memeriksa apakah permintaan berhasil—jika ya, maka 302 {@code resultCode} akan berupa {@link android.app.Activity#RESULT_OK}—dan apakah permintaan 303 yang direspons hasil ini dikenal—dalam hal ini, {@code requestCode} cocok dengan 304 parameter kedua yang dikirim dengan {@link android.app.Activity#startActivityForResult 305 startActivityForResult()}. Dari sana, kode akan menangani hasil aktivitas dengan membuat query 306 data yang dihasilkan dalam{@link android.content.Intent} (parameter {@code data}).</p> 307 308 <p>Yang terjadi adalah {@link 309 android.content.ContentResolver} melakukan query terhadap penyedia konten, yang menghasilkan 310 {@link android.database.Cursor} yang memperbolehkan data query dibaca. Untuk informasi selengkapnya, lihat dokumen 311 <a href="{@docRoot}guide/topics/providers/content-providers.html">Penyedia Konten</a>.</p> 312 313 <p>Untuk informasi selengkapnya tentang menggunakan intent, lihat dokumen <a href="{@docRoot}guide/components/intents-filters.html">Intent dan Filter 314 Intent</a>.</p> 315 316 317 <h2 id="ShuttingDown">Mematikan Aktivitas</h2> 318 319 <p>Anda bisa mematikan aktivitas dengan memanggil metode {@link android.app.Activity#finish 320 finish()}-nya. Anda juga bisa mematikan aktivitas terpisah yang sebelumnya Anda mulai dengan memanggil 321 {@link android.app.Activity#finishActivity finishActivity()}.</p> 322 323 <p class="note"><strong>Catatan:</strong> Pada umumnya, Anda tidak boleh secara eksplisit mengakhiri aktivitas 324 dengan menggunakan metode-metode ini. Seperti yang dibahas di bagian berikut tentang daur hidup aktivitas, 325 sistem Android mengelola hidup aktivitas untuk Anda, sehingga Anda tidak perlu menyelesaikan sendiri 326 aktivitas tersebut. Memanggil metode-metode ini bisa berpengaruh negatif pada pengalaman 327 pengguna yang diharapkan dan hanya boleh digunakan bila Anda benar-benar tidak ingin pengguna kembali ke 328 instance aktivitas ini.</p> 329 330 331 <h2 id="Lifecycle">Mengelola Daur Hidup Aktivitas</h2> 332 333 <p>Mengelola daur hidup aktivitas dengan mengimplementasikan metode-metode callback sangat 334 penting untuk mengembangkan 335 aplikasi yang kuat dan fleksibel. Daur hidup aktivitas dipengaruhi langsung oleh kaitannya dengan 336 aktivitas lain, tugasnya, serta back-stack.</p> 337 338 <p>Pada dasarnya, sebuah aktivitas bisa berada dalam tiga status:</p> 339 340 <dl> 341 <dt><i>Dilanjutkan</i></dt> 342 <dd>Aktivitas berada di latar depan layar dan mendapatkan fokus pengguna. (Status ini 343 kadang-kadang disebut juga dengan "running" (berjalan).)</dd> 344 345 <dt><i>Dihentikan sementara</i></dt> 346 <dd>Aktivitas lain berada di latar depan dan mendapat fokus, namun aktivitas ini masih terlihat. Yakni, 347 aktivitas lain terlihat di atas aplikasi ini dan aktivitas itu setengah transparan atau tidak 348 menuutpi seluruh layar. Aktivitas yang dihentikan sementara adalah benar-benar hidup (objek {@link android.app.Activity} 349 dipertahankan dalam memori, objek itu memelihara semua informasi status dan anggota, dan tetap dikaitkan dengan 350 window manager), namun bisa dimatikan oleh sistem dalam situasi memori sangat rendah.</dd> 351 352 <dt><i>Dihentikan</i></dt> 353 <dd>Aktivitas ditutupi sepenuhnya oleh aktivitas lain (aktivitas sekarang berada di 354 "latar belakang"). Aktivitas yang dihentikan juga masih hidup (objek {@link android.app.Activity} 355 dipertahankan dalam memori, objek itu menjaga semua informasi status dan anggota, namun <em>tidak</em> 356 dikaitkan dengan window manager). Akan tetapi, aktivitas tidak lagi terlihat bagi pengguna dan 357 bisa dimatikan oleh sistem bila memori diperlukan di lain.</dd> 358 </dl> 359 360 <p>Jika aktivitas dihentikan sementara atau dihentikan, sistem bisa mengeluarkannya dari memori baik dengan memintanya agar 361 diakhiri (memanggil metode {@link android.app.Activity#finish finish()}-nya), atau sekadar mematikan 362 prosesnya. Bila dibuka lagi (setelah diakhiri atau dimatikan), aktivitas harus dibuat dari 363 awal.</p> 364 365 366 367 <h3 id="ImplementingLifecycleCallbacks">Mengimplementasikan callback daur hidup</h3> 368 369 <p>Saat bertransisi ke dalam dan ke luar berbagai status yang dijelaskan di atas, aktivitas diberi tahu 370 melalui berbagai metode callback. Semua metode callback adalah sangkutan yang 371 bisa Anda kesampingkan untuk melakukan pekerjaan yang sesuai saat status aktivitas Anda berubah. Aktivitas skeleton 372 berikut menyertakan setiap metode daur hidup mendasar:</p> 373 374 375 <pre> 376 public class ExampleActivity extends Activity { 377 @Override 378 public void {@link android.app.Activity#onCreate onCreate}(Bundle savedInstanceState) { 379 super.onCreate(savedInstanceState); 380 // The activity is being created. 381 } 382 @Override 383 protected void {@link android.app.Activity#onStart onStart()} { 384 super.onStart(); 385 // The activity is about to become visible. 386 } 387 @Override 388 protected void {@link android.app.Activity#onResume onResume()} { 389 super.onResume(); 390 // The activity has become visible (it is now "resumed"). 391 } 392 @Override 393 protected void {@link android.app.Activity#onPause onPause()} { 394 super.onPause(); 395 // Another activity is taking focus (this activity is about to be "paused"). 396 } 397 @Override 398 protected void {@link android.app.Activity#onStop onStop()} { 399 super.onStop(); 400 // The activity is no longer visible (it is now "stopped") 401 } 402 @Override 403 protected void {@link android.app.Activity#onDestroy onDestroy()} { 404 super.onDestroy(); 405 // The activity is about to be destroyed. 406 } 407 } 408 </pre> 409 410 <p class="note"><strong>Catatan:</strong> Implementasi Anda terhadap metode-metode daur hidup ini harus 411 selalu memanggil implementasi superkelas sebelum melakukan pekerjaan apa pun, seperti yang ditampilkan dalam contoh-contoh di atas.</p> 412 413 <p>Bersama-sama, semua metode ini mendefinisikan seluruh daur hidup sebuah aktivitas. Dengan mengimplementasikan 414 metode-metode ini, Anda bisa memantau tiga loop tersarang (nested loop) dalam daur hidup aktivitas: </p> 415 416 <ul> 417 <li><b>Seluruh masa hidup</b> aktivitas berlangsung antara panggilan ke {@link 418 android.app.Activity#onCreate onCreate()} dan panggilan ke {@link 419 android.app.Activity#onDestroy}. Aktivitas Anda harus melakukan penyiapan 420 status "global" (misalnya mendefinisikan layout) dalam {@link android.app.Activity#onCreate onCreate()}, dan 421 melepas semua sisa sumber daya dalam {@link android.app.Activity#onDestroy}. Misalnya, jika 422 aktivitas Anda memiliki sebuah thread yang berjalan di latar belakang untuk mengunduh data dari jaringan, aktivitas itu bisa membuat 423 thread itu dalam {@link android.app.Activity#onCreate onCreate()} kemudian menghentikan thread dalam {@link 424 android.app.Activity#onDestroy}.</li> 425 426 <li><p><b>Masa pakai terlihat</b> (visible lifetime) aktivitas berlangsung antara panggilan ke {@link 427 android.app.Activity#onStart onStart()} dan panggilan ke {@link 428 android.app.Activity#onStop onStop()}. Selama ini, pengguna bisa melihat aktivitas 429 pada layar dan berinteraksi dengannya. Misalnya, {@link android.app.Activity#onStop onStop()} dipanggil 430 bila sebuah aktivitas baru dimulai dan aktivitas ini tidak lagi terlihat. Di antara dua metode ini, Anda bisa 431 memelihara sumber daya yang diperlukan untuk menampilkan aktivitas kepada pengguna. Misalnya, Anda bisa mendaftarkan sebuah 432 {@link android.content.BroadcastReceiver} dalam {@link 433 android.app.Activity#onStart onStart()} untuk memantau perubahan yang berdampak pada UI Anda, dan mencabut pendaftarannya 434 dalam {@link android.app.Activity#onStop onStop()} bila pengguna tidak bisa lagi melihat apa yang sedang Anda 435 tampilkan. Sistem bisa memanggil {@link android.app.Activity#onStart onStart()} dan {@link 436 android.app.Activity#onStop onStop()} beberapa kali selama masa pakai aktivitas, sambil 437 aktivitas berganti-ganti antara terlihat dan tersembunyi bagi pengguna.</p></li> 438 439 <li><p><b>Masa pakai latar depan</b> aktivitas berlangsung antara panggilan ke {@link 440 android.app.Activity#onResume onResume()} dan panggilan ke {@link android.app.Activity#onPause 441 onPause()}. Selama waktu ini, aktivitas berada di depan semua aktivitas lain pada layar dan mendapatkan 442 fokus input pengguna. Aktivitas bisa sering bertransisi ke dalam dan ke luar latar depan—misalnya, 443 {@link android.app.Activity#onPause onPause()} dipanggil bila perangkat masuk ke mode tidur atau 444 bila dialog muncul. Karena status ini bisa sering bertransisi, kode dalam dua metode ini harus 445 cukup ringan untuk menghindari transisi lamban yang membuat pengguna menunggu.</p></li> 446 </ul> 447 448 <p>Gambar 1 mengilustrasikan loop dan path yang mungkin diambil sebuah aktivitas di antara status-status. 449 Persegi panjang mewakili metode callback yang bisa Anda implementasikan untuk melakukan operasi saat 450 aktivitas bertransisi di antara status. <p> 451 452 <img src="{@docRoot}images/activity_lifecycle.png" alt="" /> 453 <p class="img-caption"><strong>Gambar 1.</strong> Daur hidup aktivitas.</p> 454 455 <p>Metode-metode callback daur hidup yang sama tercantum dalam tabel 1, yang menjelaskan setiap metode callback 456 secara lebih detail dan menentukan lokasinya masing-masing dalam 457 daur hidup aktivitas keseluruhan, termasuk apakah sistem bisa mematikan aktivitas setelah 458 metode callback selesai.</p> 459 460 <p class="table-caption"><strong>Tabel 1.</strong> Rangkuman metode callback 461 daur hidup aktivitas.</p> 462 463 <table border="2" width="85%" frame="hsides" rules="rows"> 464 <colgroup align="left" span="3"></colgroup> 465 <colgroup align="left"></colgroup> 466 <colgroup align="center"></colgroup> 467 <colgroup align="center"></colgroup> 468 469 <thead> 470 <tr><th colspan="3">Metode</th> <th>Keterangan</th> <th>Bisa dimatikan setelahnya?</th> <th>Berikutnya</th></tr> 471 </thead> 472 473 <tbody> 474 <tr> 475 <td colspan="3" align="left"><code>{@link android.app.Activity#onCreate onCreate()}</code></td> 476 <td>Dipanggil saat aktivitas pertama kali dibuat. 477 Di sinilah Anda harus melakukan semua persiapan statis normal — 478 membuat tampilan, mengikat data ke daftar, dan sebagainya. Metode ini diberi 479 sebuah objek Bundle yang berisi status aktivitas sebelumnya, jika 480 status itu tertangkap (lihat <a href="#actstate">Menyimpan Status Aktivitas</a>, 481 nanti). 482 <p>Selalu diikuti oleh {@code onStart()}.</p></td> 483 <td align="center">Tidak</td> 484 <td align="center">{@code onStart()}</td> 485 </tr> 486 487 <tr> 488 <td rowspan="5" style="border-left: none; border-right: none;"> </td> 489 <td colspan="2" align="left"><code>{@link android.app.Activity#onRestart 490 onRestart()}</code></td> 491 <td>Dipanggil setelah aktivitas dihentikan, tepat sebelum 492 dimulai lagi. 493 <p>Selalu diikuti oleh {@code onStart()}</p></td> 494 <td align="center">Tidak</td> 495 <td align="center">{@code onStart()}</td> 496 </tr> 497 498 <tr> 499 <td colspan="2" align="left"><code>{@link android.app.Activity#onStart onStart()}</code></td> 500 <td>Dipanggil tepat sebelum aktivitas menjadi terlihat bagi pengguna. 501 <p>Diikuti oleh {@code onResume()} jika aktivitas maju 502 ke latar depan, atau {@code onStop()} jika menjadi tersembunyi.</p></td> 503 <td align="center">Tidak</td> 504 <td align="center">{@code onResume()} <br/>atau<br/> {@code onStop()}</td> 505 </tr> 506 507 <tr> 508 <td rowspan="2" style="border-left: none;"> </td> 509 <td align="left"><code>{@link android.app.Activity#onResume onResume()}</code></td> 510 <td>Dipanggil tepat sebelum aktivitas mulai 511 berinteraksi dengan pengguna. Pada titik ini, aktivitas berada di 512 puncak tumpukan aktivitas, dengan input pengguna menuju kepadanya. 513 <p>Selalu diikuti oleh {@code onPause()}.</p></td> 514 <td align="center">Tidak</td> 515 <td align="center">{@code onPause()}</td> 516 </tr> 517 518 <tr> 519 <td align="left"><code>{@link android.app.Activity#onPause onPause()}</code></td> 520 <td>Dipanggil bila sistem akan memulai pelanjutan 521 aktivitas lain. Metode ini biasanya digunakan untuk menerapkan (commit) perubahan yang tidak tersimpan pada 522 data persisten, menghentikan animasi dan hal-hal lain yang mungkin menghabiskan 523 CPU, dan sebagainya. Metode ini harus melakukan apa saja yang dilakukannya dengan sangat cepat, karena 524 aktivitas berikutnya tidak akan dilanjutkan hingga aktivitas ini kembali. 525 <p>Diikuti oleh {@code onResume()} jika aktivitas 526 kembali ke depan, atau oleh {@code onStop()} jika menjadi 527 tidak terlihat bagi pengguna.</td> 528 <td align="center"><strong style="color:#800000">Ya</strong></td> 529 <td align="center">{@code onResume()} <br/>atau<br/> {@code onStop()}</td> 530 </tr> 531 532 <tr> 533 <td colspan="2" align="left"><code>{@link android.app.Activity#onStop onStop()}</code></td> 534 <td>Dipanggil bila aktivitas tidak lagi terlihat bagi pengguna. Hal ini 535 bisa terjadi karena aktivitas sedang dimusnahkan, atau karena aktivitas lain 536 (aktivitas yang ada atau yang baru) telah dilanjutkan dan sedang menutupinya. 537 <p>Diikuti oleh {@code onRestart()} jika 538 aktivitas kembali untuk berinteraksi dengan pengguna, atau oleh 539 {@code onDestroy()} jika aktivitas ini akan menghilang.</p></td> 540 <td align="center"><strong style="color:#800000">Ya</strong></td> 541 <td align="center">{@code onRestart()} <br/>atau<br/> {@code onDestroy()}</td> 542 </tr> 543 544 <tr> 545 <td colspan="3" align="left"><code>{@link android.app.Activity#onDestroy 546 onDestroy()}</code></td> 547 <td>Dipanggil sebelum aktivitas dimusnahkan. Inilah panggilan terakhir 548 yang akan diterima aktivitas. Metode ini bisa dipanggil karena 549 aktivitas selesai (seseorang memanggil <code>{@link android.app.Activity#finish 550 finish()}</code> padanya), atau karena sistem memusnahkan sementara 551 instance aktivitas ini untuk menghemat tempat. Anda bisa membedakan 552 kedua skenario ini dengan metode <code>{@link 553 android.app.Activity#isFinishing isFinishing()}</code>.</td> 554 <td align="center"><strong style="color:#800000">Ya</strong></td> 555 <td align="center"><em>tidak ada</em></td> 556 </tr> 557 </tbody> 558 </table> 559 560 <p>Kolom berlabel "Bisa dimatikan setelahnya?" menunjukkan apakah sistem bisa 561 atau tidak mematikan proses yang menjadi host aktivitas kapan saja <em>setelah metode kembali</em>, tanpa 562 menjalankan baris lain pada kode aktivitas. Tiga metode ini ditandai "ya": ({@link 563 android.app.Activity#onPause 564 onPause()}, {@link android.app.Activity#onStop onStop()}, dan {@link android.app.Activity#onDestroy 565 onDestroy()}). Karena {@link android.app.Activity#onPause onPause()} adalah yang pertama 566 dari tiga, begitu aktivitas dibuat, {@link android.app.Activity#onPause onPause()} adalah 567 metode terakhir yang dipastikan akan dipanggil sebelum proses <em>bisa</em> dimatikan—jika 568 sistem harus memulihkan memori dalam keadaan darurat, maka {@link 569 android.app.Activity#onStop onStop()} dan {@link android.app.Activity#onDestroy onDestroy()} mungkin 570 tidak dipanggil. Karena itu, Anda harus menggunakan {@link android.app.Activity#onPause onPause()} untuk menulis 571 data persisten yang penting (misalnya hasil edit pengguna) ke penyimpanan. Akan tetapi, Anda harus selektif dalam hal 572 informasi yang harus dipertahankan selama {@link android.app.Activity#onPause onPause()}, karena setiap 573 prosedur pemblokiran dalam metode ini akan memblokir transisi ke aktivitas berikutnya dan memperlambat 574 pengalaman pengguna.</p> 575 576 <p> Metode-metode yang ditandai "Tidak" dalam kolom <b>Bisa dimatikan</b> melindungi proses yang menjadi host 577 aktivitas dari dimatikan sejak saat metode dipanggil. Jadi, aktivitas bisa dimatikan 578 sejak {@link android.app.Activity#onPause onPause()} kembali hingga waktu 579 {@link android.app.Activity#onResume onResume()} dipanggil. Aktivitas tidak akan lagi bisa dimatikan hingga 580 {@link android.app.Activity#onPause onPause()} dipanggil lagi dan kembali. </p> 581 582 <p class="note"><strong>Catatan:</strong> Aktivitas yang tidak "bisa dimatikan" secara teknis oleh 583 definisi dalam tabel 1 masih bisa dimatikan oleh sistem—namun itu hany terjadi dalam 584 situasi ekstrem bila tidak ada jalan lain. Kapan aktivitas bisa dimatikan 585 akan dibahas selengkapnya dalam dokumen <a href="{@docRoot}guide/components/processes-and-threads.html">Proses dan 586 Threading</a>.</p> 587 588 589 <h3 id="SavingActivityState">Menyimpan status aktivitas</h3> 590 591 <p>Pengantar untuk <a href="#Lifecycle">Mengelola Daur Hidup Aktivitas</a> secara ringkas menyebutkan 592 bahwa 593 bila aktivitas dihentikan sementara atau dihentikan, status aktivitas akan dipertahankan. Hal itu terjadi karena 594 objek {@link android.app.Activity} masih ditahan dalam memori saat aktivitas dihentikan sementara atau 595 dihentikan—semua informasi tentang anggota dan statusnya saat ini masih hidup. Jadi, setiap perubahan 596 yang dibuat pengguna dalam aktivitas akan dipertahankan sehingga bila aktivitas kembali ke 597 latar depan (bila "dilanjutkan"), perubahan itu masih ada.</p> 598 599 <p>Akan tetapi, bila sistem memusnahkan aktivitas untuk memulihkan memori, objek {@link 600 android.app.Activity} akan dimusnahkan, sehingga sistem tidak bisa sekadar melanjutkan aktivitas dengan status 601 tidak berubah. Sebagai gantinya, sistem harus membuat ulang objek {@link android.app.Activity} jika pengguna 602 menyusuri kembali ke aktivitas tersebut. Namun, pengguna tidak menyadari 603 bahwa sistem memusnahkan aktivitas dan membuatnya kembali dan, karena itu, mungkin 604 mengharapkan aktivitas untuk sama persis dengan sebelumnya. Dalam situasi ini, Anda bisa memastikan bahwa 605 informasi penting tentang status aktivitas tetap terjaga dengan mengimplementasikan 606 metode callback tambahan yang memungkinkan Anda menyimpan informasi tentang status aktivitas: {@link 607 android.app.Activity#onSaveInstanceState onSaveInstanceState()}.</p> 608 609 <p>Sistem memanggil {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} 610 sebelum membuat aktivitas rawan terhadap pemusnahan. Sistem meneruskan ke metode ini 611 sebuah {@link android.os.Bundle} tempat Anda bisa menyimpan 612 informasi status tentang aktivitas sebagai pasangan nama-nilai, dengan menggunakan metode-metode misalnya {@link 613 android.os.Bundle#putString putString()} dan {@link 614 android.os.Bundle#putInt putInt()}. Kemudian, jika sistem mematikan proses aplikasi Anda 615 dan pengguna menyusuri kembali ke aktivitas tersebut, sistem akan membuat kembali aktivitas dan meneruskan 616 {@link android.os.Bundle} ke {@link android.app.Activity#onCreate onCreate()} maupun {@link 617 android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}. Dengan menggunakan salah satu 618 metode ini, Anda bisa mengekstrak status tersimpan dari {@link android.os.Bundle} dan memulihkan 619 status aktivitas. Jika tidak ada informasi status untuk dipulihkan, maka {@link 620 android.os.Bundle} yang diteruskan kepada adalah Anda null (yang akan terjadi bila aktivitas dibuat untuk 621 pertama kali).</p> 622 623 <img src="{@docRoot}images/fundamentals/restore_instance.png" alt="" /> 624 <p class="img-caption"><strong>Gambar 2.</strong> Ada dua cara yang bisa digunakan aktivitas untuk kembali ke fokus pengguna 625 dengan status tetap: aktivitas dimusnahkan, kemudian dibuat kembali, dan aktivitas harus memulihkan 626 status yang disimpan sebelumnya, atau aktivitas dihentikan, kemudian dilanjutkan dengan status aktivitas 627 tetap.</p> 628 629 <p class="note"><strong>Catatan:</strong> Tidak ada jaminan bahwa {@link 630 android.app.Activity#onSaveInstanceState onSaveInstanceState()} akan dipanggil sebelum 631 aktivitas Anda dimusnahkan, karena bisa saja terjadi aktivitas tidak perlu menyimpan status 632 (misalnya saat pengguna meninggalkan aktivitas Anda dengan menggunakan tombol <em>Back</em>, karena pengguna menutup aktivitas 633 secara eksplisit 634 ). Jika sistem memanggil {@link android.app.Activity#onSaveInstanceState 635 onSaveInstanceState()}, ini akan dilakukan sebelum {@link 636 android.app.Activity#onStop onStop()} dan mungkin sebelum {@link android.app.Activity#onPause 637 onPause()}.</p> 638 639 <p>Akan tetapi, sekalipun Anda tidak melakukan apa-apa dan tidak mengimplementasikan {@link 640 android.app.Activity#onSaveInstanceState onSaveInstanceState()}, beberapa status aktivitas 641 akan dipulihkan oleh implementasi default {@link 642 android.app.Activity#onSaveInstanceState onSaveInstanceState()} dalam kelas {@link android.app.Activity}. Khususnya, 643 implementasi default akan memanggil metode {@link 644 android.view.View#onSaveInstanceState onSaveInstanceState()} yang sesuai untuk setiap {@link 645 android.view.View} dalam layout, yang memungkinkan setiap tampilan untuk memberi informasi tentang dirinya 646 yang harus disimpan. Hampir setiap widget dalam kerangka kerja Android mengimplementasikan metode ini 647 sebagaimana mestinya, sehingga setiap perubahan yang terlihat pada UI akan disimpan dan dipulihkan secara otomatis bila 648 aktivitas Anda dibuat kembali. Misalnya, widget {@link android.widget.EditText} menyimpan teks apa saja 649 yang dimasukkan oleh pengguna dan widget {@link android.widget.CheckBox} menyimpan baik teks itu diperiksa maupun 650 tidak. Satu-satunya pekerjaan yang Anda perlukan adalah memberikan ID unik (dengan atribut <a href="{@docRoot}guide/topics/resources/layout-resource.html#idvalue">{@code android:id}</a> 651 ) untuk masing-masing widget yang ingin disimpan statusnya. Jika widget tidak memiliki ID, maka sistem 652 tidak bisa menyimpan statusnya.</p> 653 654 <div class="sidebox-wrapper"> 655 <div class="sidebox"> 656 <p>Anda juga bisa menghentikan secara eksplisit sebuah tampilan dalam layout Anda agar tidak menyimpan statusnya dengan mengatur atribut 657 {@link android.R.attr#saveEnabled android:saveEnabled} ke {@code "false"} atau dengan memanggil 658 metode {@link android.view.View#setSaveEnabled setSaveEnabled()}. Biasanya, Anda tidak boleh 659 menonaktifkannya, namun Anda boleh melakukannya jika ingin memulihkan status UI aktivitas secara berbeda.</p> 660 </div> 661 </div> 662 663 <p>Walaupun implementasi default {@link 664 android.app.Activity#onSaveInstanceState onSaveInstanceState()} menyimpan informasi yang berguna tentang 665 UI aktivitas, Anda mungkin masih perlu mengesampingkannya untuk menyimpan informasi tambahan. 666 Misalnya, Anda mungkin perlu menyimpan nilai-nilai anggota yang berubah selama masa pakai aktivitas (yang 667 mungkin berkorelasi dengan nilai-nilai yang dipulihkan dalam UI, namun anggota-anggota yang menyimpan nilai-nilai UI itu tidak 668 dipulihkan, secara default).</p> 669 670 <p>Karena implementasi default {@link 671 android.app.Activity#onSaveInstanceState onSaveInstanceState()} membantu menyimpan status UI, jika 672 Anda mengesampingkan metode ini untuk menyimpan informasi tambahan status, Anda harus selalu memanggil 673 implementasi superkelas {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} 674 sebelum melakukan pekerjaan apa pun. Demikian pula, Anda juga harus memanggil implementasi superkelas {@link 675 android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} jika Anda mengesampingkannya, sehingga 676 implementasi default bisa memulihkan status tampilan.</p> 677 678 <p class="note"><strong>Catatan:</strong> Karena {@link android.app.Activity#onSaveInstanceState 679 onSaveInstanceState()} tidak dijamin 680 akan dipanggil, Anda harus menggunakannya hanya untuk mencatat status aktivitas sementara (transient) (status 681 UI)—Anda tidak boleh menggunakannya untuk menyimpan data persisten. Sebagai gantinya, Anda harus menggunakan {@link 682 android.app.Activity#onPause onPause()} untuk menyimpan data persisten (misalnya data yang harus disimpan 683 ke database) saat pengguna meninggalkan aktivitas.</p> 684 685 <p>Salah satu cara yang baik untuk menguji kemampuan aplikasi dalam memulihkan statusnya adalah cukup dengan memutar 686 perangkat sehingga orientasi layarnya berubah. Bila orientasi layar berubah, sistem 687 akan memusnahkan dan membuat kembali aktivitas untuk menerapkan sumber daya alternatif yang mungkin tersedia 688 untuk konfigurasi layar baru. Karena alasan ini saja, sangat penting bahwa aktivitas Anda 689 memulihkan statusnya secara lengkap saat dibuat kembali, karena pengguna memutar layar secara rutin saat 690 menggunakan aplikasi.</p> 691 692 693 <h3 id="ConfigurationChanges">Menangani perubahan konfigurasi</h3> 694 695 <p>Sebagian konfigurasi perangkat bisa berubah saat runtime (misalnya orientasi layar, ketersediaan keyboard 696 , dan bahasa). Bila terjadi perubahan demikian, Android akan membuat kembali aktivitas yang berjalan 697 (sistem akan memanggil {@link android.app.Activity#onDestroy}, kemudian segera memanggil {@link 698 android.app.Activity#onCreate onCreate()}). Perilaku ini 699 didesain untuk membantu aplikasi Anda menyesuaikan diri dengan konfigurasi baru dengan cara memuat ulang 700 aplikasi Anda secara otomatis dengan sumber daya alternatif yang telah Anda sediakan (misalnya layout yang berbeda untuk 701 layar orientasi dan ukuran yang berbeda).</p> 702 703 <p>Jika Anda mendesain aktivitas dengan benar untuk menangani restart karena perubahan orientasi layar dan 704 memulihkan status aktivitas seperti yang dijelaskan di atas, aplikasi Anda akan lebih tahan terhadap 705 kejadian tidak terduga lainnya dalam daur hidup aktivitas.</p> 706 707 <p>Cara terbaik menangani restart tersebut adalah 708 menyimpan dan memulihkan status aktivitas Anda dengan menggunakan {@link 709 android.app.Activity#onSaveInstanceState onSaveInstanceState()} dan {@link 710 android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} (atau {@link 711 android.app.Activity#onCreate onCreate()}), seperti yang dibahas di bagian sebelumnya.</p> 712 713 <p>Untuk informasi selengkapnya tentang konfigurasi perubahan yang terjadi saat program berjalan dan cara menanganinya 714 , bacalah panduan untuk <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Menangani 715 Perubahan Runtime</a>.</p> 716 717 718 719 <h3 id="CoordinatingActivities">Mengoordinasikan aktivitas</h3> 720 721 <p>Bila suatu aktivitas memulai aktivitas lain, keduanya akan mengalami transisi daur hidup. Aktivitas pertama 722 akan berhenti sementara dan berhenti sama sekali (walau tidak akan berhenti jika masih terlihat di latar belakang), saat 723 aktivitas lain dibuat. Jika aktivitas-aktivitas ini berbagi data yang disimpan ke disk atau di tempat lain, Anda perlu 724 memahami bahwa aktivitas pertama tidak dihentikan sepenuhnya sebelum aktivitas kedua dibuat. 725 Sebagai gantinya, proses akan memulai aktivitas kedua secara tumpang tindih dengan proses penghentian 726 aktivitas pertama.</p> 727 728 <p>Urutan callback daur hidup didefinisikan dengan baik, khususnya bila kedua aktivitas berada dalam 729 proses yang sama dan salah satunya memulai yang lain. Berikut ini adalah urutan operasi yang terjadi bila Aktivitas 730 A memulai Aktivitas B: </p> 731 732 <ol> 733 <li>Metode {@link android.app.Activity#onPause onPause()} Aktivitas A berjalan.</li> 734 735 <li>Metode-metode {@link android.app.Activity#onCreate onCreate()}, {@link 736 android.app.Activity#onStart onStart()}, dan {@link android.app.Activity#onResume onResume()} 737 Aktivitas B berjalan secara berurutan. (Aktivitas B sekarang mendapatkan fokus pengguna.)</li> 738 739 <li>Kemudian, jika Aktivitas A tidak lagi terlihat di layar, metode {@link 740 android.app.Activity#onStop onStop()}-nya akan dijalankan.</li> 741 </ol> 742 743 <p>Urutan callback daur hidup yang bisa diramalkan ini memungkinkan Anda mengelola transisi 744 informasi dari satu aktivitas ke aktivitas lainnya. Misalnya, jika Anda harus menulis ke database saat 745 aktivitas pertama berhenti agar aktivitas berikutnya bisa membacanya, maka Anda harus menulis ke 746 database selama {@link android.app.Activity#onPause onPause()} sebagai ganti selama {@link 747 android.app.Activity#onStop onStop()}.</p> 748 749 <!-- 750 <h2>Beginner's Path</h2> 751 752 <p>For more information about how Android maintains a history of activities and 753 enables user multitasking, continue with the <b><a 754 href="{@docRoot}guide/components/tasks-and-back-stack.html">Tasks and Back 755 Stack</a></b> document.</p> 756 --> 757