1page.title=Tugas dan Back-Stack 2parent.title=Aktivitas 3parent.link=activities.html 4@jd:body 5 6<div id="qv-wrapper"> 7<div id="qv"> 8 9<h2>Dalam dokumen ini</h2> 10<ol> 11<li><a href="#ActivityState">Menyimpan Status Aktivitas</a></li></li> 12<li><a href="#ManagingTasks">Mengelola Tugas</a> 13 <ol> 14 <li><a href="#TaskLaunchModes">Mendefinisikan mode peluncuran</a></li> 15 <li><a href="#Affinities">Menangani afinitas</a></li> 16 <li><a href="#Clearing">Menghapus back-stack</a></li> 17 <li><a href="#Starting">Memulai tugas</a></li> 18 </ol> 19</li> 20</ol> 21 22<h2>Artikel</h2> 23<ol> 24 <li><a href="http://android-developers.blogspot.com/2010/04/multitasking-android-way.html"> 25 Multitasking Ala Android</a></li> 26</ol> 27 28<h2>Lihat juga</h2> 29<ol> 30 <li><a href="{@docRoot}design/patterns/navigation.html">Desain Android: 31Navigasi</a></li> 32 <li><a href="{@docRoot}guide/topics/manifest/activity-element.html">Elemen manifes 33{@code <activity>}</a></li> 34 <li><a href="{@docRoot}guide/components/recents.html">Layar Ikhtisar</a></li> 35</ol> 36</div> 37</div> 38 39 40<p>Sebuah aplikasi biasanya berisi beberapa <a href="{@docRoot}guide/components/activities.html">aktivitas</a>. Setiap aktivitas 41harus didesain dengan jenis tindakan tertentu yang bisa dilakukan pengguna dan bisa memulai aktivitas 42lain. Misalnya, aplikasi email mungkin memiliki satu aktivitas untuk menampilkan daftar pesan baru. 43Bila pengguna memilih sebuah pesan, aktivitas baru akan terbuka untuk melihat pesan tersebut.</p> 44 45<p>Aktivitas bahkan bisa memulai aktivitas yang ada dalam aplikasi lain di perangkat. Misalnya 46, jika aplikasi Anda ingin mengirim pesan email, Anda bisa mendefinisikan intent untuk melakukan tindakan 47"kirim" dan menyertakan sejumlah data, seperti alamat email dan pesan. Aktivitas dari aplikasi 48lain yang mendeklarasikan dirinya untuk menangani jenis intent ini akan terbuka. Dalam hal ini, intent 49tersebut untuk mengirim email, sehingga aktivitas "menulis" pada aplikasi email akan dimulai (jika beberapa aktivitas 50mendukung intent yang sama, maka sistem akan memungkinkan pengguna memilih mana yang akan digunakan). Bila email telah 51dikirim, aktivitas Anda akan dilanjutkan dan seolah-olah aktivitas email adalah bagian dari aplikasi Anda. Meskipun 52aktivitas mungkin dari aplikasi yang berbeda, Android akan tetap mempertahankan pengalaman pengguna yang mulus 53dengan menjalankan kedua aktivitas dalam <em>tugas</em> yang sama.</p> 54 55<p>Tugas adalah kumpulan aktivitas yang berinteraksi dengan pengguna 56saat melakukan pekerjaan tertentu. Aktivitas tersebut diatur dalam tumpukan (<em>back-stack</em>), dalam 57urutan membuka setiap aktivitas.</p> 58 59<!-- SAVE FOR WHEN THE FRAGMENT DOC IS ADDED 60<div class="sidebox-wrapper"> 61<div class="sidebox"> 62<h3>Adding fragments to a task's back stack</h3> 63 64<p>Your activity can also include {@link android.app.Fragment}s to the back stack. For example, 65suppose you have a two-pane layout using fragments, one of which is a list view (fragment A) and the 66other being a layout to display an item from the list (fragment B). When the user selects an item 67from the list, fragment B is replaced by a new fragment (fragment C). In this case, it might be 68desireable for the user to navigate back to reveal fragment B, using the <em>Back</em> button.</p> 69<p>In order to add fragment B to the back stack so that this is possible, you must call {@link 70android.app.FragmentTransaction#addToBackStack addToBackStack()} before you {@link 71android.app.FragmentTransaction#commit()} the transaction that replaces fragment B with fragment 72C.</p> 73<p>For more information about using fragments and adding them to the back stack, see the {@link 74android.app.Fragment} class documentation.</p> 75 76</div> 77</div> 78--> 79 80<p>Layar Home perangkat adalah tempat memulai hampir semua tugas. Bila pengguna menyentuh ikon di launcher 81aplikasi 82(atau pintasan pada layar Home), tugas aplikasi tersebut akan muncul pada latar depan. Jika tidak ada 83tugas untuk aplikasi (aplikasi tidak digunakan baru-baru ini), maka tugas baru 84akan dibuat dan aktivitas "utama" untuk aplikasi tersebut akan terbuka sebagai aktivitas akar dalam back-stack.</p> 85 86<p>Bila aktivitas saat ini dimulai lagi, aktivitas baru akan didorong ke atas back-stack dan 87mengambil fokus. Aktivitas sebelumnya tetap dalam back-stack, namun dihentikan. Bila aktivitas 88dihentikan, sistem akan mempertahankan status antarmuka penggunanya saat ini. Bila pengguna menekan tombol 89<em>Back</em> 90, aktivitas saat ini akan dikeluarkan dari atas back-stack (aktivitas dimusnahkan) dan 91 aktivitas sebelumnya dilanjutkan (status UI sebelumnya dipulihkan). Aktivitas dalam back-stack 92tidak pernah disusun ulang, hanya didorong dan dikeluarkan dari back-stack—yang didorong ke back-stack saat dimulai oleh 93aktivitas saat ini dan dikeluarkan bila pengguna meninggalkannya menggunakan tombol <em>Back</em>. Dengan demikian, 94back-stack 95beroperasi sebagai struktur objek "masuk terakhir, keluar pertama". Gambar 1 melukiskan perilaku 96ini dengan jangka waktu yang menunjukkan kemajuan antar aktivitas beserta 97back-stack pada setiap waktu.</p> 98 99<img src="{@docRoot}images/fundamentals/diagram_backstack.png" alt="" /> 100<p class="img-caption"><strong>Gambar 1.</strong> Representasi tentang cara setiap aktivitas baru dalam 101tugas menambahkan item ke back-stack. Bila pengguna menekan tombol <em>Back</em>, aktivitas 102saat ini 103akan dimusnahkan dan aktivitas sebelumnya dilanjutkan.</p> 104 105 106<p>Jika pengguna terus menekan <em>Back</em>, maka setiap aktivitas dalam back-stack akan dikeluarkan untuk 107menampilkan 108yang sebelumnya, sampai pengguna kembali ke layar Home (atau aktivitas mana pun yang sedang dijalankan saat tugas 109dimulai. Bila semua aktivitas telah dihapus dari back-stack, maka tugas tidak akan ada lagi.</p> 110 111<div class="figure" style="width:287px"> 112<img src="{@docRoot}images/fundamentals/diagram_multitasking.png" alt="" /> <p 113class="img-caption"><strong>Gambar 2.</strong> Dua tugas: Tugas B menerima interaksi pengguna 114di latar depan, sedangkan Tugas A di latar belakang, menunggu untuk dilanjutkan.</p> 115</div> 116<div class="figure" style="width:215px"> 117 <img src="{@docRoot}images/fundamentals/diagram_multiple_instances.png" alt="" /> <p 118class="img-caption"><strong>Gambar 3.</strong> Satu aktivitas dibuat instance-nya beberapa kali.</p> 119</div> 120 121<p>Tugas adalah unit kohesif yang bisa dipindahkan ke "latar belakang" bila pengguna memulai tugas baru atau masuk ke 122layar Home, melalui tombol<em>Home</em>. Sementara di latar belakang, semua aktivitas dalam 123tugas 124dihentikan, namun back-stack untuk tugas tidak berubah—tugas kehilangan fokus saat 125tugas lain berlangsung, seperti yang ditampilkan dalam gambar 2. Kemudian, tugas bisa kembali ke "latar depan" agar pengguna 126bisa melanjutkan tugas di tempat menghentikannya. Anggaplah, misalnya, tugas saat ini (Tugas A) memiliki tiga 127aktivitas dalam back-stack—dua pada aktivitas saat ini. Pengguna menekan tombol <em>Home</em> 128, kemudian 129memulai aplikasi baru dari launcher aplikasi. Bila muncul layar Home, Tugas A akan beralih 130ke latar belakang. Bila aplikasi baru dimulai, sistem akan memulai tugas untuk aplikasi tersebut 131(Tugas B) dengan back-stack aktivitas sendiri. Setelah berinteraksi dengan aplikasi 132tersebut, pengguna akan kembali ke Home lagi dan memilih aplikasi yang semula 133memulai Tugas A. Sekarang, Tugas A muncul di 134latar depan—ketiga aktivitas dalam back-stack tidak berubah dan aktivitas di atas 135back-stack akan dilanjutkan. Pada 136titik ini pengguna juga bisa beralih kembali ke Tugas B dengan masuk ke Home dan memilih ikon aplikasi 137yang memulai tugas tersebut (atau dengan memilih tugas aplikasi dari 138<a href="{@docRoot}guide/components/recents.html">layar ikhtisar</a>). 139Ini adalah contoh dari melakukan multitasking di Android.</p> 140 141<p class="note"><strong>Catatan:</strong> Beberapa tugas bisa berlangsung di latar belakang secara bersamaan. 142Akan tetapi, jika pengguna menjalankan banyak tugas di latar belakang sekaligus, sistem mungkin mulai 143menghapus aktivitas latar belakang untuk memulihkan memori, yang akan menyebabkan status aktivitas hilang. 144Lihat bagian berikut tentang <a href="#ActivityState">Status aktivitas</a>.</p> 145 146<p>Karena aktivitas di back-stack tidak pernah diatur ulang, jika aplikasi Anda memungkinkan 147pengguna untuk memulai aktivitas tertentu dari lebih dari satu aktivitas, instance baru 148aktivitas tersebut akan dibuat dan didorong ke back-stack (bukannya memunculkan instance sebelumnya dari 149aktivitas ke atas). Dengan demikian, satu aktivitas pada aplikasi Anda mungkin dibuat beberapa 150kali (bahkan dari beberapa tugas), seperti yang ditampilkan dalam gambar 3. Dengan demikian, jika pengguna mengarahkan mundur 151menggunakan tombol <em>Back</em>, setiap instance aktivitas ini akan ditampilkan dalam urutan saat 152dibuka (masing-masing 153dengan status UI sendiri). Akan tetapi, Anda bisa memodifikasi perilaku ini jika tidak ingin aktivitas 154dibuat instance-nya lebih dari sekali. Caranya dibahas di bagian selanjutnya tentang <a href="#ManagingTasks">Mengelola Tugas</a>.</p> 155 156 157<p>Untuk meringkas perilaku default aktivitas dan tugas:</p> 158 159<ul> 160 <li>Bila Aktivitas A memulai Aktivitas B, Aktivitas A dihentikan, namun sistem mempertahankan statusnya 161(seperti posisi gulir dan teks yang dimasukkan ke dalam formulir). 162Jika pengguna menekan tombol <em>Back</em> saat dalam Aktivitas B, Aktivitas A akan dilanjutkan dengan status 163yang dipulihkan.</li> 164 <li>Bila pengguna meninggalkan tugas dengan menekan tombol <em>Home</em> aktivitas saat ini akan 165dihentikan dan 166tugas beralih ke latar belakang. Sistem akan mempertahankan status setiap aktivitas dalam tugas. Jika 167nanti pengguna melanjutkan tugas dengan memilih ikon launcher yang memulai tugas, tugas tersebut akan 168beralih ke latar depan dan melanjutkan aktivitas di atas back-stack.</li> 169 <li>Jika pengguna menekan tombol <em>Back</em>, aktivitas saat ini akan dikeluarkan dari back-stack 170dan 171dimusnahkan. Aktivitas sebelumnya dalam back-stack akan dilanjutkan. Bila suatu aktivitas dimusnahkan, sistem 172<em>tidak akan</em>mempertahankan status aktivitas.</li> 173 <li>Aktivitas bisa dibuat instance-nya beberapa kali, bahkan dari tugas-tugas lainnya.</li> 174</ul> 175 176 177<div class="note design"> 178<p><strong>Desain Navigasi</strong></p> 179 <p>Untuk mengetahui selengkapnya tentang cara kerja navigasi aplikasi di Android, baca panduan <a href="{@docRoot}design/patterns/navigation.html">Navigasi</a> Desain Android.</p> 180</div> 181 182 183<h2 id="ActivityState">Menyimpan Status Aktivitas</h2> 184 185<p>Seperti dibahas di atas, perilaku default sistem akan mempertahankan status aktivitas bila 186dihentikan. Dengan cara ini, bila pengguna mengarah kembali ke aktivitas sebelumnya, antarmuka pengguna akan muncul 187seperti saat ditinggalkan. Akan tetapi, Anda bisa—dan <strong>harus</strong>—secara proaktif mempertahankan 188status aktivitas menggunakan metode callback, jika aktivitas ini dimusnahkan dan harus 189dibuat kembali.</p> 190 191<p>Bila sistem menghentikan salah satu aktivitas (seperti saat aktivitas baru dimulai atau tugas 192dipindah ke latar belakang), sistem mungkin memusnahkan aktivitas sepenuhnya jika perlu memulihkan 193memori sistem. Bila hal ini terjadi, informasi tentang status aktivitas akan hilang. Jika hal ini terjadi, sistem 194masih 195mengetahui bahwa aktivitas memiliki tempat di back-stack, namun saat aktivitas tersebut dibawa ke bagian teratas 196back-stack, sistem harus membuatnya kembali (bukan melanjutkannya). Untuk 197menghindari hilangnya pekerjaan pengguna, Anda harus secara proaktif mempertahankannya dengan menerapkan metode callback 198{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} 199dalam aktivitas.</p> 200 201<p>Untuk informasi selengkapnya tentang cara menyimpan status aktivitas Anda, lihat dokumen 202<a href="{@docRoot}guide/components/activities.html#SavingActivityState">Aktivitas</a>.</p> 203 204 205 206<h2 id="ManagingTasks">Mengelola Tugas</h2> 207 208<p>Cara Android mengelola tugas dan back-stack, seperti yang dijelaskan di atas—dengan menempatkan semua 209aktivitas yang dimulai secara berurutan dalam tugas yang sama dan dalam back-stack "masuk terakhir, keluar pertama"—berfungsi 210dengan baik untuk kebanyakan aplikasi dan Anda tidak perlu khawatir tentang cara mengaitkan aktivitas 211dengan tugas atau cara penempatannya di back-stack. Akan tetapi, Anda bisa memutuskan apakah ingin menyela 212perilaku normal. Mungkin Anda ingin agar suatu aktivitas dalam aplikasi untuk memulai tugas baru bila telah 213dimulai (sebagai ganti menempatkannya dalam tugas saat ini); atau, bila memulai aktivitas, Anda ingin 214memajukan instance yang ada (sebagai ganti membuat instance 215baru pada bagian teratas back-stack); atau, Anda ingin back-stack dihapus dari semua 216aktivitas selain untuk aktivitas akar bila pengguna meninggalkan tugas.</p> 217 218<p>Anda bisa melakukan semua ini dan lainnya, dengan atribut dalam elemen manifes 219<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> 220dan dengan flag pada intent yang Anda teruskan ke 221{@link android.app.Activity#startActivity startActivity()}.</p> 222 223<p>Dalam hal ini, atribut<a href="{@docRoot}guide/topics/manifest/activity-element.html"> 224{@code <activity>}</a> utama yang bisa Anda gunakan adalah:</p> 225 226<ul class="nolist"> 227 <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#aff"> 228 {@code taskAffinity}</a></li> 229 <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode"> 230 {@code launchMode}</a></li> 231 <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#reparent"> 232 {@code allowTaskReparenting}</a></li> 233 <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#clear"> 234 {@code clearTaskOnLaunch}</a></li> 235 <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#always"> 236 {@code alwaysRetainTaskState}</a></li> 237 <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#finish"> 238 {@code finishOnTaskLaunch}</a></li> 239</ul> 240 241<p>Dan flag intent utama yang bisa Anda gunakan adalah:</p> 242 243<ul class="nolist"> 244 <li>{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}</li> 245 <li>{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP}</li> 246 <li>{@link android.content.Intent#FLAG_ACTIVITY_SINGLE_TOP}</li> 247</ul> 248 249<p>Dalam bagian berikut, Anda akan melihat cara menggunakan beberapa atribut manifes ini dan flag 250intent untuk mendefinisikan cara mengaitkan aktivitas dengan tugas dan cara perilakunya di back-stack.</p> 251 252<p>Juga, pertimbangan cara menyatakan dan mengelola tugas dan aktivitas 253dibahas secara terpisah di layar ikhtisar. Lihat <a href="{@docRoot}guide/components/recents.html">Layar Ikhtisar</a> 254untuk informasi selengkapnya. Biasanya Anda harus mengizinkan sistem mendefinisikan cara menyatakan tugas dan 255aktivitas di layar ikhtisar, dan Anda tidak perlu memodifikasi perilaku ini.</p> 256 257<p class="caution"><strong>Perhatian:</strong> Kebanyakan aplikasi tidak harus menyela perilaku 258default untuk aktivitas dan tugas. Jika merasa bahwa aktivitas Anda perlu memodifikasi 259perilaku default, lakukan dengan hati-hati dan pastikan menguji kegunaan aktivitas selama 260dijalankan dan saat mengarahkan kembali ke sana dari aktivitas dan tugas lain dengan tombol <em>Back</em>. 261Pastikan menguji perilaku navigasi yang mungkin bertentangan dengan perilaku yang diharapkan pengguna.</p> 262 263 264<h3 id="TaskLaunchModes">Mendefinisikan mode peluncuran</h3> 265 266<p>Mode peluncuran memungkinkan Anda mendefinisikan cara mengaitkan instance baru dari suatu aktivitas dengan 267tugas saat ini. Anda bisa mendefinisikan beragam mode peluncuran dalam dua cara:</p> 268<ul class="nolist"> 269 <li><a href="#ManifestForTasks">Menggunakan file manifes</a> 270 <p>Bila Anda mendeklarasikan aktivitas dalam file manifes, Anda bisa menetapkan cara mengaitkan aktivitas 271dengan tugas-tugas saat mulai.</li> 272 <li><a href="#IntentFlagsForTasks">Menggunakan flag intent</a> 273 <p>Saat memanggil{@link android.app.Activity#startActivity startActivity()}, 274Anda bisa menyertakan flag dalam {@link android.content.Intent} yang menyatakan cara (atau 275apakah) aktivitas baru tersebut harus dikaitkan dengan tugas saat ini.</p></li> 276</ul> 277 278<p>Dengan demikian, jika Aktivitas A memulai Aktivitas B, Aktivitas B bisa mendefinisikan dalam manifesnya cara 279mengaitkan dengan tugas saat ini (jika sama sekali) dan Aktivitas A juga bisa meminta cara mengaitkan Aktivitas B 280dengan tugas saat ini. Jika kedua aktivitas mendefinisikan cara mengaitkan Aktivitas B 281dengan tugas, maka permintaan Aktivitas A (sebagaimana didefinisikan dalam intent) lebih dihargai daripada 282permintaan Aktivitas B (sebagaimana didefinisikan dalam manifesnya).</p> 283 284<p class="note"><strong>Catatan:</strong> Beberapa mode peluncuran yang tersedia untuk file manifes 285tidak tersedia sebagai flag untuk intent dan, juga, beberapa mode peluncuran yang tersedia sebagai flag 286untuk intent tidak bisa didefinisikan dalam manifest.</p> 287 288 289<h4 id="ManifestForTasks">Menggunakan file manifes</h4> 290 291<p>Saat mendeklarasikan aktivitas dalam file manifes, Anda bisa menetapkan cara mengaitkan aktivitas 292dengan tugas menggunakan <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> 293melalui atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code 294launchMode}</a> elemen.</p> 295 296<p>Atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code 297launchMode}</a> menetapkan instruksi tentang cara meluncurkan aktivitas 298ke dalam tugas. Ada empat macam mode peluncuran yang bisa Anda tetapkan ke atribut 299<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">launchMode</a></code> 300:</p> 301 302<dl> 303<dt>{@code "standard"} (mode default)</dt> 304 <dd>Default. Sistem membuat instance baru aktivitas dalam tugas yang 305akan menjadi tempat memulainya dan mengarahkan intent ke sana. Aktivitas ini bisa dibuat instance-nya beberapa kali, 306masing-masing instance bisa dimiliki oleh tugas berbeda, dan satu tugas bisa memiliki beberapa instance.</dd> 307<dt>{@code "singleTop"}</dt> 308 <dd>Jika instance aktivitas sudah ada di bagian teratas tugas saat ini, sistem 309akan mengarahkan intent ke instance tersebut melalui panggilan ke metode {@link 310android.app.Activity#onNewIntent onNewIntent()}, bukan membuat instance baru dari 311aktivitas tersebut. Aktivitas bisa dibuat instance-nya beberapa kali, masing-masing instance bisa dimiliki 312oleh tugas berbeda, dan satu tugas bisa memiliki beberapa instance (namun hanya jika 313aktivitas di bagian teratas back-stack <em>bukan</em> instance yang ada dari aktivitas tersebut). 314 <p>Misalnya, anggaplah back-stack tugas terdiri dari aktivitas A akar dengan aktivitas B, C, 315dan D di bagian teratas (back-stack adalah A-B-C-D; D yang teratas). Intent masuk untuk aktivitas tipe D. 316Jika D memiliki mode peluncuran {@code "standard"} default, instance baru dari kelas ini akan diluncurkan dan 317back-stack menjadi A-B-C-D-D. Namun, jika mode peluncuran D adalah {@code "singleTop"}, instance 318yang ada dari D akan menerima intent melalui {@link 319android.app.Activity#onNewIntent onNewIntent()}, karena ada di bagian teratas back-stack— 320back-stack tetap A-B-C-D. Akan tetapi, jika intent masuk untuk aktivitas tipe B, maka 321instance B baru akan ditambahkan ke back-stack, sekalipun mode peluncuran adalah{@code "singleTop"}.</p> 322 <p class="note"><strong>Catatan:</strong> Bila instance dari aktivitas baru telah dibuat, 323pengguna bisa menekan tombol <em>Back</em> untuk kembali ke aktivitas sebelumnya. Namun bila instance 324yang ada dari 325aktivitas menangani intent baru, pengguna tidak bisa menekan tombol <em>Back</em> untuk kembali ke 326status 327aktivitas sebelum intent baru masuk di {@link android.app.Activity#onNewIntent 328onNewIntent()}.</p> 329</dd> 330 331<dt>{@code "singleTask"}</dt> 332 <dd>Sistem membuat tugas baru dan membuat instance aktivitas di akar tugas baru. 333Akan tetapi, jika instance aktivitas sudah ada dalam tugas terpisah, sistem akan mengarahkan 334intent ke instance yang ada melalui panggilan ke metode {@link 335android.app.Activity#onNewIntent onNewIntent()}, bukan membuat instance baru. Hanya 336boleh ada satu instance aktivitas untuk setiap kalinya. 337 <p class="note"><strong>Catatan:</strong> Meskipun aktivitas dimulai di tugas baru, tombol 338<em>Back</em> tetap akan mengembalikan pengguna ke aktivitas sebelumnya.</p></dd> 339<dt>{@code "singleInstance"}.</dt> 340 <dd>Sama seperti {@code "singleTask"}, namun sistem tidak meluncurkan aktivitas lain ke 341tugas yang menyimpan instance. Aktivitas selalu satu dan satu-satunya anggota dari tugasnya; 342aktivitas apa pun yang dimulai dengan ini akan dibuka di tugas yang terpisah.</dd> 343</dl> 344 345 346<p>Sebagai contoh lainnya, aplikasi Browser Android mendeklarasikan bahwa aktivitas browser web harus 347selalu dibuka dalam tugasnya sendiri—dengan menetapkan mode pembuka {@code singleTask} dalam elemen<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a>. 348Ini berarti bahwa jika aplikasi Anda mengeluarkan 349intent untuk membuka Browser Android, aktivitasnya <em>tidak</em> akan ditempatkan dalam tugas 350yang sama seperti aplikasi Anda. Sebagai gantinya, tugas baru akan dimulai untuk Browser atau, jika Browser 351sudah memiliki tugas yang berjalan di latar belakang, tugas tersebut akan dimajukan untuk menangani intent 352baru.</p> 353 354<p>Baik aktivitas dimulai dalam tugas baru atau maupun dalam tugas yang sama seperti aktivitas yang memulainya, tombol 355<em>Back</em> selalu membawa pengguna ke aktivitas sebelumnya. Akan tetapi, jika 356Anda memulai aktivitas yang menetapkan mode pembuka {@code singleTask}, maka jika instance 357aktivitas tersebut ada dalam tugas latar belakang, seluruh tugas tersebut akan dibawa ke latar depan. Pada titik 358ini, back-stack sekarang menyertakan semua aktivitas dari tugas yang dimajukan, di atas 359back-stack. Gambar 4 mengilustrasikan tipe skenario ini.</p> 360 361<img src="{@docRoot}images/fundamentals/diagram_backstack_singletask_multiactivity.png" alt="" /> 362<p class="img-caption"><strong>Gambar 4.</strong> Representasi tentang cara aktivitas dengan 363mode pembuka "singleTask" ditambahkan ke back-stack. Jika aktivitas tersebut sudah menjadi bagian dari 364tugas latar belakang dengan back-stack sendiri, maka seluruh back-stack juga 365dimajukan, di atas tugas saat ini.</p> 366 367<p>Untuk informasi selengkapnya tentang menggunakan mode pembuka dalam file manifes, lihat dokumentasi elemen 368<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 369, di mana atribut {@code launchMode} dan nilai-nilai yang diterima 370akan dibahas selengkapnya.</p> 371 372<p class="note"><strong>Catatan:</strong> Perilaku yang Anda tentukan untuk aktivitas dengan atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> 373bisa dikesampingkan dengan flag yang disertakan bersama intent yang memulai aktivitas Anda, seperti dibahas dalam 374bagian berikutnya.</p> 375 376 377 378<h4 id="#IntentFlagsForTasks">Menggunakan flag Intent</h4> 379 380<p>Saat memulai aktivitas, Anda bisa memodifikasi asosiasi default aktivitas pada tugasnya 381 dengan menyertakan flag dalam intent yang Anda kirimkan ke {@link 382android.app.Activity#startActivity startActivity()}. Flag yang bisa Anda gunakan untuk memodifikasi perilaku default 383adalah:</p> 384 385<p> 386 <dt>{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}</dt> 387 <dd>Memulai aktivitas dalam tugas baru. Jika tugas sudah dijalankan untuk aktivitas yang sekarang 388Anda mulai, tugas tersebut akan dibawa ke latar depan dengan status terakhir yang dipulihkan dan aktivitas 389akan menerima intent baru dalam {@link android.app.Activity#onNewIntent onNewIntent()}. 390 <p>Ini menghasilkan perilaku yang sama dengan nilai {@code "singleTask"} <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> 391yang dibahas di bagian sebelumnya.</p></dd> 392 <dt>{@link android.content.Intent#FLAG_ACTIVITY_SINGLE_TOP}</dt> 393 <dd>Jika aktivitas yang dimulai adalah aktivitas saat ini (di bagian teratas back-stack), maka 394instance yang ada akan menerima panggilan ke {@link android.app.Activity#onNewIntent onNewIntent()} 395sebagai ganti membuat instance baru aktivitas. 396 <p>Ini menghasilkan perilaku yang sama dengan nilai {@code "singleTop"} <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> 397yang dibahas di bagian sebelumnya.</p></dd> 398 <dt>{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP}</dt> 399 <dd>Jika aktivitas yang dimulai sudah berjalan dalam tugas saat ini, maka sebagai 400ganti meluncurkan instance baru aktivitas tersebut, semua kegiatan lain di atasnya akan 401dimusnahkan dan intent ini akan disampaikan ke instance aktivitas yang dilanjutkan (sekarang di atas), 402melalui {@link android.app.Activity#onNewIntent onNewIntent()}). 403 <p>Tidak ada nilai untuk atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> 404 yang menghasilkan perilaku ini.</p> 405 <p>{@code FLAG_ACTIVITY_CLEAR_TOP} paling sering digunakan bersama dengan 406 {@code FLAG_ACTIVITY_NEW_TASK}. 407Bila digunakan bersama-sama, flag ini adalah cara penempatan aktivitas yang ada 408dalam tugas lain dan meletakkannya dalam posisi yang memungkinkannya merespons intent. </p> 409 <p class="note"><strong>Catatan:</strong> Jika mode pembuka aktivitas yang didesain adalah 410{@code "standard"}, 411ini juga akan dihapus dari back-stack dan instance baru akan diluncurkan di tempatnya untuk menangani 412intent yang masuk. Itu karena instance baru selalu dibuat untuk intent baru bila 413mode peluncuran adalah {@code "standard"}. </p> 414</dd> 415</dl> 416 417 418 419 420 421<h3 id="Affinities">Menangani afinitas</h3> 422 423<p><em>Afinitas</em> menunjukkan tugas mana yang disukai aktivitas untuk dimiliki. Secara default, semua 424aktivitas aplikasi yang sama memiliki afinitas untuk satu sama lain. Jadi, secara default, semua 425aktivitas dalam aplikasi yang sama lebih menyukai berada dalam tugas yang sama. Akan tetapi, Anda bisa memodifikasi 426afinitas default untuk suatu aktivitas. Aktivitas yang didefinisikan dalam 427aplikasi yang berbeda bisa berbagi afinitas, atau aktivitas yang didefinisikan dalam aplikasi yang sama bisa 428diberi afinitas tugas yang berbeda.</p> 429 430<p>Anda bisa memodifikasi afinitas untuk setiap yang diberikan 431dengan atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a> 432elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a>.</p> 433 434<p>Atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a> 435mengambil nilai string, yang harus unik dari nama paket default 436yang dideklarasikan dalam elemen <a href="{@docRoot}guide/topics/manifest/manifest-element.html"> 437{@code <manifest>} 438</a>, karena sistem menggunakan nama untuk mengidentifikasi afinitas 439tugas default untuk aplikasi.</p> 440 441<p>Afinitas berperan dalam dua keadaan:</p> 442<ul> 443 <li>Bila intent yang meluncurkan aktivitas berisi flag 444 {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} 445. 446 447<p>Aktivitas baru, secara default, diluncurkan ke dalam tugas aktivitas 448yang disebut {@link android.app.Activity#startActivity startActivity()}. Ini didorong ke back-stack 449yang sama seperti caller. Akan tetapi, jika intent yang diteruskan ke 450{@link android.app.Activity#startActivity startActivity()} 451berisi flag {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} 452, maka sistem akan mencari tugas yang berbeda untuk menampung aktivitas baru. Sering kali, itu adalah tugas baru. 453Akan tetapi, tidak harus demikian. Jika sudah ada tugas lama dengan afinitas yang sama seperti 454aktivitas baru, aktivitas ini akan diluncurkan ke dalam tugas tersebut. Jika tidak, tugas baru akan dimulai.</p> 455 456<p>Jika flag ini menyebabkan aktivitas memulai tugas baru dan pengguna menekan tombol <em>Home</em> 457untuk meninggalkannya, 458harus ada cara bagi pengguna untuk mengarahkan kembali ke tugas. Beberapa entitas (seperti 459notification manager) selalu memulai aktivitas dalam tugas eksternal, tidak pernah sebagai bagian dari miliknya sendiri, jadi 460selalu menempatkan {@code FLAG_ACTIVITY_NEW_TASK} dalam intent yang diteruskan ke 461{@link android.app.Activity#startActivity startActivity()}. 462Jika Anda memiliki aktivitas yang bisa dipanggil melalui 463entitas eksternal yang mungkin menggunakan flag ini, hati-hatilah karena pengguna memiliki cara independen untuk kembali 464ke tugas yang telah dimulai, seperti dengan ikon launcher (aktivitas akar dari tugas 465memiliki filter intent {@link android.content.Intent#CATEGORY_LAUNCHER}; lihat bagian <a href="#Starting">Memulai tugas</a> di bawah ini).</p> 466</li> 467 468 <li>Bila aktivitas memiliki atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#reparent"> 469{@code allowTaskReparenting}</a> sendiri yang diatur ke {@code "true"}. 470 <p>Dalam hal ini, aktivitas bisa berpindah dari tugas yang dimulainya ke tugas yang afinitasnya 471dimilikinya, bila tugas tersebut di bawa ke latar depan.</p> 472 <p>Misalnya, anggaplah sebuah aktivitas melaporkan kondisi cuaca di sejumlah kota terpilih 473yang didefinisikan sebagai bagian dari aplikasi perjalanan. Aktivitas memiliki afinitas yang sama dengan aktivitas lain dalam aplikasi 474yang sama (afinitas aplikasi default) dan aktivitas ini memungkinkan re-parenting dengan atribut ini. 475Bila salah satu aktivitas Anda memulai aktivitas laporan cuaca, awalnya aktivitas ini dimiliki oleh tugas 476yang sama dengan aktivitas Anda. Akan tetapi, bila tugas aplikasi perjalanan di bawa ke latar depan, 477aktivitas laporan cuaca akan ditetapkan kembali ke tugas itu dan ditampilkan di dalamnya.</p> 478</li> 479</ul> 480 481<p class="note"><strong>Tip:</strong> Jika file {@code .apk} berisi lebih dari satu "aplikasi" 482dari sudut pandang pengguna, Anda mungkin perlu menggunakan atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a> 483 untuk menetapkan afinitas berbeda pada aktivitas yang terkait dengan setiap "aplikasi".</p> 484 485 486 487<h3 id="Clearing">Menghapus back-stack</h3> 488 489<p>Jika pengguna meninggalkan tugas dalam waktu yang lama, sistem akan menghapus tugas semua aktivitas kecuali 490aktivitas akar. Bila pengguna kembali ke tugas itu lagi, hanya aktivitas akar yang akan dipulihkan. 491Sistem berperilaku seperti ini, karena, setelah sekian waktu, pengguna mungkin telah mengabaikan 492apa yang mereka kerjakan sebelum dan kembali ke tugas itu untuk memulai sesuatu yang baru. </p> 493 494<p>Ada beberapa atribut aktivitas yang bisa Anda gunakan untuk memodifikasi perilaku ini: </p> 495 496<dl> 497<dt><code><a 498href="{@docRoot}guide/topics/manifest/activity-element.html#always">alwaysRetainTaskState</a></code> 499</dt> 500<dd>Jika atribut ini ditetapkan ke {@code "true"} dalam aktivitas akar tugas, 501perilaku default yang baru dijelaskan tidak akan terjadi. 502 Tugas akan mempertahankan semua aktivitas dalam back-stack bahkan setelah sekian lama.</dd> 503 504<dt><code><a 505href="{@docRoot}guide/topics/manifest/activity-element.html#clear">clearTaskOnLaunch</a></code></dt> 506<dd>Jika atribut ini diatur ke {@code "true"} dalam aktivitas akar tugas, back- 507stack akan dihapus hingga aktivitas akar bila pengguna meninggalkan tugas 508dan kembali lagi. Dengan kata lain, ini adalah lawan dari 509<a href="{@docRoot}guide/topics/manifest/activity-element.html#always"> 510{@code alwaysRetainTaskState}</a>. Pengguna selalu kembali ke tugas dengan 511status awalnya, walaupun hanya sebentar meninggalkan tugas.</dd> 512 513<dt><code><a 514href="{@docRoot}guide/topics/manifest/activity-element.html#finish">finishOnTaskLaunch</a></code> 515</dt> 516<dd>Atribut ini seperti <a href="{@docRoot}guide/topics/manifest/activity-element.html#clear">{@code clearTaskOnLaunch}</a>, 517namun beroperasi pada 518satu aktivitas, bukan pada seluruh tugas. Hal ini juga bisa menyebabkan aktivitas 519hilang, termasuk aktivitas akar. Bila ini diatur ke {@code "true"}, 520aktivitas akan tetap menjadi bagian dari tugas hanya untuk sesi saat ini. Jika pengguna 521keluar dan kemudian kembali ke tugas tersebut, tugas tidak akan ada lagi.</dd> 522</dl> 523 524 525 526 527<h3 id="Starting">Memulai tugas</h3> 528 529<p>Anda bisa mengatur aktivitas sebagai titik masuk untuk tugas dengan memberikan filter intent dengan 530{@code "android.intent.action.MAIN"} sebagai tindakan yang ditetapkan dan 531{@code "android.intent.category.LAUNCHER"} 532sebagai kategori yang ditetapkan. Misalnya:</p> 533 534<pre> 535<activity ... > 536 <intent-filter ... > 537 <action android:name="android.intent.action.MAIN" /> 538 <category android:name="android.intent.category.LAUNCHER" /> 539 </intent-filter> 540 ... 541</activity> 542</pre> 543 544<p>Filter intent semacam ini akan menyebabkan ikon dan label untuk 545aktivitas ditampilkan dalam launcher aplikasi, yang akan memberi cara kepada pengguna untuk meluncurkan aktivitas dan 546kembali ke tugas yang dibuatnya kapan saja setelah ia telah diluncurkan. 547</p> 548 549<p>Kemampuan kedua ini penting: Pengguna harus bisa meninggalkan tugas dan kemudian kembali ke tugas tersebut 550nanti dengan menggunakan launcher aktivitas ini. Karena itu, kedua <a href="#LaunchModes">mode 551pembuka</a> yang menandai aktivitas selalu memulai tugas, {@code "singleTask"} dan 552{@code "singleInstance"}, hanya boleh digunakan bila aktivitas memiliki filter 553{@link android.content.Intent#ACTION_MAIN} 554dan {@link android.content.Intent#CATEGORY_LAUNCHER}. Bayangkan, misalnya, apa yang akan 555terjadi jika filter tidak ada: Intent meluncurkan aktivitas{@code "singleTask"}, memulai 556tugas yang baru, dan pengguna menghabiskan lebih banyak waktu mengerjakan tugas tersebut. Pengguna kemudian menekan tombol 557<em>Home</em>. Tugas kini dikirim ke latar belakang dan tidak terlihat. Sekarang pengguna tidak memiliki cara untuk kembali 558ke tugas tersebut, karena tidak dinyatakan dalam launcher aplikasi.</p> 559 560<p>Untuk kasus-kasus di mana Anda tidak ingin pengguna bisa kembali ke aktivitas, atur dalam 561<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 562 pada 563<a href="{@docRoot}guide/topics/manifest/activity-element.html#finish">{@code finishOnTaskLaunch}</a> 564elemen ke {@code "true"} (lihat <a href="#Clearing">Menghapus back-stack</a>).</p> 565 566<p>Informasi lebih jauh tentang cara menyatakan dan mengelola tugas dan aktivitas dalam 567layar ikhtisar tersedia dalam<a href="{@docRoot}guide/components/recents.html"> 568Layar Ikhtisar</a>.</p> 569 570<!-- 571<h2>Beginner's Path</h2> 572 573<p>For more information about how to use intents to 574activate other application components and publish the intents to which your components 575respond, continue with the <b><a 576href="{@docRoot}guide/components/intents-filters.html">Intents and Intent 577Filters</a></b> document.</p> 578--> 579