Home | History | Annotate | Download | only in components
      1 page.title=Tugas dan Back-Stack
      2 parent.title=Aktivitas
      3 parent.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:
     31 Navigasi</a></li>
     32   <li><a href="{@docRoot}guide/topics/manifest/activity-element.html">Elemen manifes
     33 {@code &lt;activity&gt;}</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
     41 harus didesain dengan jenis tindakan tertentu yang bisa dilakukan pengguna dan bisa memulai aktivitas
     42 lain. Misalnya, aplikasi email mungkin memiliki satu aktivitas untuk menampilkan daftar pesan baru.
     43 Bila 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
     48 lain yang mendeklarasikan dirinya untuk menangani jenis intent ini akan terbuka. Dalam hal ini, intent
     49 tersebut untuk mengirim email, sehingga aktivitas "menulis" pada aplikasi email akan dimulai (jika beberapa aktivitas
     50 mendukung intent yang sama, maka sistem akan memungkinkan pengguna memilih mana yang akan digunakan). Bila email telah
     51 dikirim, aktivitas Anda akan dilanjutkan dan seolah-olah aktivitas email adalah bagian dari aplikasi Anda. Meskipun
     52 aktivitas mungkin dari aplikasi yang berbeda, Android akan tetap mempertahankan pengalaman pengguna yang mulus
     53 dengan menjalankan kedua aktivitas dalam <em>tugas</em> yang sama.</p>
     54 
     55 <p>Tugas adalah kumpulan aktivitas yang berinteraksi dengan pengguna
     56 saat melakukan pekerjaan tertentu. Aktivitas tersebut diatur dalam tumpukan (<em>back-stack</em>), dalam
     57 urutan 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,
     65 suppose you have a two-pane layout using fragments, one of which is a list view (fragment A) and the
     66 other being a layout to display an item from the list (fragment B). When the user selects an item
     67 from the list, fragment B is replaced by a new fragment (fragment C). In this case, it might be
     68 desireable 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
     70 android.app.FragmentTransaction#addToBackStack addToBackStack()} before you {@link
     71 android.app.FragmentTransaction#commit()} the transaction that replaces fragment B with fragment
     72 C.</p>
     73 <p>For more information about using fragments and adding them to the back stack, see the {@link
     74 android.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
     81 aplikasi
     82 (atau pintasan pada layar Home), tugas aplikasi tersebut akan muncul pada latar depan. Jika tidak ada
     83 tugas untuk aplikasi (aplikasi tidak digunakan baru-baru ini), maka tugas baru
     84 akan 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
     87 mengambil fokus. Aktivitas sebelumnya tetap dalam back-stack, namun dihentikan. Bila aktivitas
     88 dihentikan, 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
     92 tidak pernah disusun ulang, hanya didorong dan dikeluarkan dari back-stack&mdash;yang didorong ke back-stack saat dimulai oleh
     93 aktivitas saat ini dan dikeluarkan bila pengguna meninggalkannya menggunakan tombol <em>Back</em>. Dengan demikian,
     94 back-stack
     95 beroperasi sebagai struktur objek "masuk terakhir, keluar pertama". Gambar 1 melukiskan perilaku
     96 ini dengan jangka waktu yang menunjukkan kemajuan antar aktivitas beserta
     97 back-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
    101 tugas menambahkan item ke back-stack. Bila pengguna menekan tombol <em>Back</em>, aktivitas
    102 saat ini
    103 akan 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
    107 menampilkan
    108 yang sebelumnya, sampai pengguna kembali ke layar Home (atau aktivitas mana pun yang sedang dijalankan saat tugas
    109 dimulai. 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
    113 class="img-caption"><strong>Gambar 2.</strong> Dua tugas: Tugas B menerima interaksi pengguna
    114 di 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
    118 class="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
    122 layar Home, melalui tombol<em>Home</em>. Sementara di latar belakang, semua aktivitas dalam
    123 tugas
    124 dihentikan, namun back-stack untuk tugas tidak berubah&mdash;tugas kehilangan fokus saat
    125 tugas lain berlangsung, seperti yang ditampilkan dalam gambar 2. Kemudian, tugas bisa kembali ke "latar depan" agar pengguna
    126 bisa melanjutkan tugas di tempat menghentikannya. Anggaplah, misalnya, tugas saat ini (Tugas A) memiliki tiga
    127 aktivitas dalam back-stack&mdash;dua pada aktivitas saat ini. Pengguna menekan tombol <em>Home</em>
    128 , kemudian
    129 memulai aplikasi baru dari launcher aplikasi. Bila muncul layar Home, Tugas A akan beralih
    130 ke 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
    132 tersebut, pengguna akan kembali ke Home lagi dan memilih aplikasi yang semula
    133 memulai Tugas A. Sekarang, Tugas A muncul di
    134 latar depan&mdash;ketiga aktivitas dalam back-stack tidak berubah dan aktivitas di atas
    135 back-stack akan dilanjutkan. Pada
    136 titik ini pengguna juga bisa beralih kembali ke Tugas B dengan masuk ke Home dan memilih ikon aplikasi
    137 yang memulai tugas tersebut (atau dengan memilih tugas aplikasi dari
    138 <a href="{@docRoot}guide/components/recents.html">layar ikhtisar</a>).
    139 Ini 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.
    142 Akan tetapi, jika pengguna menjalankan banyak tugas di latar belakang sekaligus, sistem mungkin mulai
    143 menghapus aktivitas latar belakang untuk memulihkan memori, yang akan menyebabkan status aktivitas hilang.
    144 Lihat 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
    147 pengguna untuk memulai aktivitas tertentu dari lebih dari satu aktivitas, instance baru
    148 aktivitas tersebut akan dibuat dan didorong ke back-stack (bukannya memunculkan instance sebelumnya dari
    149 aktivitas ke atas). Dengan demikian, satu aktivitas pada aplikasi Anda mungkin dibuat beberapa
    150 kali (bahkan dari beberapa tugas), seperti yang ditampilkan dalam gambar 3. Dengan demikian, jika pengguna mengarahkan mundur
    151 menggunakan tombol <em>Back</em>, setiap instance aktivitas ini akan ditampilkan dalam urutan saat
    152 dibuka (masing-masing
    153 dengan status UI sendiri). Akan tetapi, Anda bisa memodifikasi perilaku ini jika tidak ingin aktivitas
    154 dibuat 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).
    162 Jika pengguna menekan tombol <em>Back</em> saat dalam Aktivitas B, Aktivitas A akan dilanjutkan dengan status
    163 yang dipulihkan.</li>
    164   <li>Bila pengguna meninggalkan tugas dengan menekan tombol <em>Home</em> aktivitas saat ini akan
    165 dihentikan dan
    166 tugas beralih ke latar belakang. Sistem akan mempertahankan status setiap aktivitas dalam tugas. Jika
    167 nanti pengguna melanjutkan tugas dengan memilih ikon launcher yang memulai tugas, tugas tersebut akan
    168 beralih 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
    170 dan
    171 dimusnahkan. 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
    186 dihentikan. Dengan cara ini, bila pengguna mengarah kembali ke aktivitas sebelumnya, antarmuka pengguna akan muncul
    187 seperti saat ditinggalkan. Akan tetapi, Anda bisa&mdash;dan <strong>harus</strong>&mdash;secara proaktif mempertahankan
    188 status aktivitas menggunakan metode callback, jika aktivitas ini dimusnahkan dan harus
    189 dibuat kembali.</p>
    190 
    191 <p>Bila sistem menghentikan salah satu aktivitas (seperti saat aktivitas baru dimulai atau tugas
    192 dipindah ke latar belakang), sistem mungkin memusnahkan aktivitas sepenuhnya jika perlu memulihkan
    193 memori sistem. Bila hal ini terjadi, informasi tentang status aktivitas akan hilang. Jika hal ini terjadi, sistem
    194 masih
    195 mengetahui bahwa aktivitas memiliki tempat di back-stack, namun saat aktivitas tersebut dibawa ke bagian teratas
    196 back-stack, sistem harus membuatnya kembali (bukan melanjutkannya). Untuk
    197 menghindari hilangnya pekerjaan pengguna, Anda harus secara proaktif mempertahankannya dengan menerapkan metode callback
    198 {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}
    199 dalam 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&mdash;dengan menempatkan semua
    209 aktivitas yang dimulai secara berurutan dalam tugas yang sama dan dalam back-stack "masuk terakhir, keluar pertama"&mdash;berfungsi
    210 dengan baik untuk kebanyakan aplikasi dan Anda tidak perlu khawatir tentang cara mengaitkan aktivitas
    211 dengan tugas atau cara penempatannya di back-stack. Akan tetapi, Anda bisa memutuskan apakah ingin menyela
    212 perilaku normal. Mungkin Anda ingin agar suatu aktivitas dalam aplikasi untuk memulai tugas baru bila telah
    213 dimulai (sebagai ganti menempatkannya dalam tugas saat ini); atau, bila memulai aktivitas, Anda ingin
    214 memajukan instance yang ada (sebagai ganti membuat instance
    215 baru pada bagian teratas back-stack); atau, Anda ingin back-stack dihapus dari semua
    216 aktivitas 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 &lt;activity&gt;}</a>
    220 dan 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 &lt;activity&gt;}</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
    250 intent 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
    253 dibahas secara terpisah di layar ikhtisar. Lihat <a href="{@docRoot}guide/components/recents.html">Layar Ikhtisar</a>
    254 untuk informasi selengkapnya. Biasanya Anda harus mengizinkan sistem mendefinisikan cara menyatakan tugas dan
    255 aktivitas 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
    258 default untuk aktivitas dan tugas. Jika merasa bahwa aktivitas Anda perlu memodifikasi
    259 perilaku default, lakukan dengan hati-hati dan pastikan menguji kegunaan aktivitas selama
    260 dijalankan dan saat mengarahkan kembali ke sana dari aktivitas dan tugas lain dengan tombol <em>Back</em>.
    261 Pastikan 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
    267 tugas 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
    271 dengan tugas-tugas saat mulai.</li>
    272   <li><a href="#IntentFlagsForTasks">Menggunakan flag intent</a>
    273     <p>Saat memanggil{@link android.app.Activity#startActivity startActivity()},
    274 Anda bisa menyertakan flag dalam {@link android.content.Intent} yang menyatakan cara (atau
    275 apakah) 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
    279 mengaitkan dengan tugas saat ini (jika sama sekali) dan Aktivitas A juga bisa meminta cara mengaitkan Aktivitas B
    280 dengan tugas saat ini. Jika kedua aktivitas mendefinisikan cara mengaitkan Aktivitas B
    281 dengan tugas, maka permintaan Aktivitas A (sebagaimana didefinisikan dalam intent) lebih dihargai daripada
    282 permintaan Aktivitas B (sebagaimana didefinisikan dalam manifesnya).</p>
    283 
    284 <p class="note"><strong>Catatan:</strong> Beberapa mode peluncuran yang tersedia untuk file manifes
    285 tidak tersedia sebagai flag untuk intent dan, juga, beberapa mode peluncuran yang tersedia sebagai flag
    286 untuk 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
    292 dengan tugas menggunakan <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>
    293 melalui atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code
    294 launchMode}</a> elemen.</p>
    295 
    296 <p>Atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code
    297 launchMode}</a> menetapkan instruksi tentang cara meluncurkan aktivitas
    298 ke 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
    305 akan menjadi tempat memulainya dan mengarahkan intent ke sana. Aktivitas ini bisa dibuat instance-nya beberapa kali,
    306 masing-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
    309 akan mengarahkan intent ke instance tersebut melalui panggilan ke metode {@link
    310 android.app.Activity#onNewIntent onNewIntent()}, bukan membuat instance baru dari
    311 aktivitas tersebut. Aktivitas bisa dibuat instance-nya beberapa kali, masing-masing instance bisa dimiliki
    312 oleh tugas berbeda, dan satu tugas bisa memiliki beberapa instance (namun hanya jika
    313 aktivitas 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,
    315 dan D di bagian teratas (back-stack adalah A-B-C-D; D yang teratas). Intent masuk untuk aktivitas tipe D.
    316 Jika D memiliki mode peluncuran {@code "standard"} default, instance baru dari kelas ini akan diluncurkan dan
    317 back-stack menjadi A-B-C-D-D. Namun, jika mode peluncuran D adalah {@code "singleTop"}, instance
    318 yang ada dari D akan menerima intent melalui {@link
    319 android.app.Activity#onNewIntent onNewIntent()}, karena ada di bagian teratas back-stack&mdash;
    320 back-stack tetap A-B-C-D. Akan tetapi, jika intent masuk untuk aktivitas tipe B, maka
    321 instance 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,
    323 pengguna bisa menekan tombol <em>Back</em> untuk kembali ke aktivitas sebelumnya. Namun bila instance
    324 yang ada dari
    325 aktivitas menangani intent baru, pengguna tidak bisa menekan tombol <em>Back</em> untuk kembali ke
    326 status
    327 aktivitas sebelum intent baru masuk di {@link android.app.Activity#onNewIntent
    328 onNewIntent()}.</p>
    329 </dd>
    330 
    331 <dt>{@code "singleTask"}</dt>
    332   <dd>Sistem membuat tugas baru dan membuat instance aktivitas di akar tugas baru.
    333 Akan tetapi, jika instance aktivitas sudah ada dalam tugas terpisah, sistem akan mengarahkan
    334 intent ke instance yang ada melalui panggilan ke metode {@link
    335 android.app.Activity#onNewIntent onNewIntent()}, bukan membuat instance baru. Hanya
    336 boleh 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
    341 tugas yang menyimpan instance. Aktivitas selalu satu dan satu-satunya anggota dari tugasnya;
    342 aktivitas 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
    347 selalu dibuka dalam tugasnya sendiri&mdash;dengan menetapkan mode pembuka {@code singleTask} dalam elemen<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>.
    348 Ini berarti bahwa jika aplikasi Anda mengeluarkan
    349 intent untuk membuka Browser Android, aktivitasnya <em>tidak</em> akan ditempatkan dalam tugas
    350 yang sama seperti aplikasi Anda. Sebagai gantinya, tugas baru akan dimulai untuk Browser atau, jika Browser
    351 sudah memiliki tugas yang berjalan di latar belakang, tugas tersebut akan dimajukan untuk menangani intent
    352 baru.</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
    356 Anda memulai aktivitas yang menetapkan mode pembuka {@code singleTask}, maka jika instance
    357 aktivitas tersebut ada dalam tugas latar belakang, seluruh tugas tersebut akan dibawa ke latar depan. Pada titik
    358 ini, back-stack sekarang menyertakan semua aktivitas dari tugas yang dimajukan, di atas
    359 back-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
    363 mode pembuka "singleTask" ditambahkan ke back-stack. Jika aktivitas tersebut sudah menjadi bagian dari
    364 tugas latar belakang dengan back-stack sendiri, maka seluruh back-stack juga
    365 dimajukan, 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">&lt;activity&gt;</a></code>
    369 , di mana atribut {@code launchMode} dan nilai-nilai yang diterima
    370 akan 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>
    373 bisa dikesampingkan dengan flag yang disertakan bersama intent yang memulai aktivitas Anda, seperti dibahas dalam
    374 bagian 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
    382 android.app.Activity#startActivity startActivity()}. Flag yang bisa Anda gunakan untuk memodifikasi perilaku default
    383 adalah:</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
    388 Anda mulai, tugas tersebut akan dibawa ke latar depan dengan status terakhir yang dipulihkan dan aktivitas
    389 akan 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>
    391 yang 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
    394 instance yang ada akan menerima panggilan ke {@link android.app.Activity#onNewIntent onNewIntent()}
    395 sebagai 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>
    397 yang 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
    400 ganti meluncurkan instance baru aktivitas tersebut, semua kegiatan lain di atasnya akan
    401 dimusnahkan dan intent ini akan disampaikan ke instance aktivitas yang dilanjutkan (sekarang di atas),
    402 melalui {@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}.
    407 Bila digunakan bersama-sama, flag ini adalah cara penempatan aktivitas yang ada
    408 dalam 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"},
    411 ini juga akan dihapus dari back-stack dan instance baru akan diluncurkan di tempatnya untuk menangani
    412 intent yang masuk.  Itu karena instance baru selalu dibuat untuk intent baru bila
    413 mode 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
    424 aktivitas aplikasi yang sama memiliki afinitas untuk satu sama lain. Jadi, secara default, semua
    425 aktivitas dalam aplikasi yang sama lebih menyukai berada dalam tugas yang sama. Akan tetapi, Anda bisa memodifikasi
    426 afinitas default untuk suatu aktivitas. Aktivitas yang didefinisikan dalam
    427 aplikasi yang berbeda bisa berbagi afinitas, atau aktivitas yang didefinisikan dalam aplikasi yang sama bisa
    428 diberi afinitas tugas yang berbeda.</p>
    429 
    430 <p>Anda bisa memodifikasi afinitas untuk setiap yang diberikan
    431 dengan atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a>
    432 elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>.</p>
    433 
    434 <p>Atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a>
    435 mengambil nilai string, yang harus unik dari nama paket default
    436 yang dideklarasikan dalam elemen <a href="{@docRoot}guide/topics/manifest/manifest-element.html">
    437 {@code &lt;manifest&gt;}
    438 </a>, karena sistem menggunakan nama untuk mengidentifikasi afinitas
    439 tugas 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
    448 yang disebut {@link android.app.Activity#startActivity startActivity()}. Ini didorong ke back-stack
    449 yang sama seperti caller.  Akan tetapi, jika intent yang diteruskan ke
    450 {@link android.app.Activity#startActivity startActivity()}
    451 berisi 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.
    453 Akan tetapi, tidak harus demikian.  Jika sudah ada tugas lama dengan afinitas yang sama seperti
    454 aktivitas 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>
    457 untuk meninggalkannya,
    458 harus ada cara bagi pengguna untuk mengarahkan kembali ke tugas. Beberapa entitas (seperti
    459 notification manager) selalu memulai aktivitas dalam tugas eksternal, tidak pernah sebagai bagian dari miliknya sendiri, jadi
    460 selalu menempatkan {@code FLAG_ACTIVITY_NEW_TASK} dalam intent yang diteruskan ke
    461 {@link android.app.Activity#startActivity startActivity()}.
    462 Jika Anda memiliki aktivitas yang bisa dipanggil melalui
    463 entitas eksternal yang mungkin menggunakan flag ini, hati-hatilah karena pengguna memiliki cara independen untuk kembali
    464 ke tugas yang telah dimulai, seperti dengan ikon launcher (aktivitas akar dari tugas
    465 memiliki 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
    471 dimilikinya, bila tugas tersebut di bawa ke latar depan.</p>
    472   <p>Misalnya, anggaplah sebuah aktivitas melaporkan kondisi cuaca di sejumlah kota terpilih
    473 yang didefinisikan sebagai bagian dari aplikasi perjalanan.  Aktivitas memiliki afinitas yang sama dengan aktivitas lain dalam aplikasi
    474 yang sama (afinitas aplikasi default) dan aktivitas ini memungkinkan re-parenting dengan atribut ini.
    475 Bila salah satu aktivitas Anda memulai aktivitas laporan cuaca, awalnya aktivitas ini dimiliki oleh tugas
    476 yang sama dengan aktivitas Anda. Akan tetapi, bila tugas aplikasi perjalanan di bawa ke latar depan,
    477 aktivitas 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"
    482 dari 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
    490 aktivitas akar.  Bila pengguna kembali ke tugas itu lagi, hanya aktivitas akar yang akan dipulihkan.
    491 Sistem berperilaku seperti ini, karena, setelah sekian waktu, pengguna mungkin telah mengabaikan
    492 apa 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
    498 href="{@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,
    501 perilaku 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
    505 href="{@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-
    507 stack akan dihapus hingga aktivitas akar bila pengguna meninggalkan tugas
    508 dan 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
    511 status awalnya, walaupun hanya sebentar meninggalkan tugas.</dd>
    512 
    513 <dt><code><a
    514 href="{@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>,
    517 namun beroperasi pada
    518 satu aktivitas, bukan pada seluruh tugas.  Hal ini juga bisa menyebabkan aktivitas
    519 hilang, termasuk aktivitas akar.  Bila ini diatur ke {@code "true"},
    520 aktivitas akan tetap menjadi bagian dari tugas hanya untuk sesi saat ini.  Jika pengguna
    521 keluar 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"}
    532 sebagai kategori yang ditetapkan. Misalnya:</p>
    533 
    534 <pre>
    535 &lt;activity ... &gt;
    536     &lt;intent-filter ... &gt;
    537         &lt;action android:name="android.intent.action.MAIN" /&gt;
    538         &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
    539     &lt;/intent-filter&gt;
    540     ...
    541 &lt;/activity&gt;
    542 </pre>
    543 
    544 <p>Filter intent semacam ini akan menyebabkan ikon dan label untuk
    545 aktivitas ditampilkan dalam launcher aplikasi, yang akan memberi cara kepada pengguna untuk meluncurkan aktivitas dan
    546 kembali 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
    550 nanti dengan menggunakan launcher aktivitas ini. Karena itu, kedua <a href="#LaunchModes">mode
    551 pembuka</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}
    554 dan {@link android.content.Intent#CATEGORY_LAUNCHER}. Bayangkan, misalnya, apa yang akan
    555 terjadi jika filter tidak ada: Intent meluncurkan aktivitas{@code "singleTask"}, memulai
    556 tugas 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
    558 ke 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">&lt;activity&gt;</a></code>
    562  pada
    563 <a href="{@docRoot}guide/topics/manifest/activity-element.html#finish">{@code finishOnTaskLaunch}</a>
    564 elemen 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
    567 layar ikhtisar tersedia dalam<a href="{@docRoot}guide/components/recents.html">
    568 Layar Ikhtisar</a>.</p>
    569 
    570 <!--
    571 <h2>Beginner's Path</h2>
    572 
    573 <p>For more information about how to use intents to
    574 activate other application components and publish the intents to which your components
    575 respond, continue with the <b><a
    576 href="{@docRoot}guide/components/intents-filters.html">Intents and Intent
    577 Filters</a></b> document.</p>
    578 -->
    579