Cari Blog Ini

Senin, 08 Januari 2018

Pengenalan Komponen Android Studio: RecyclerView

Secara definisi RecyclerView adalah sebuah komponen tampilan (widget) yang lebih canggih ketimbang pendahulunya ListViewdan bersifat lebih fleksibel. Dan yang paling penting adalah RecyclerView memiliki kemampuan untuk menampilkan data secara efisien dalam jumlah yang besar. Terlebih jika anda memiliki koleksi data yang tiap elemennya mampu berubah-ubah sewaktu dijalankan (runtime) karena interaksi pengguna atau karena adanya pengaruh dari jaringan internet.


Gambar di atas akan menjelaskan beberapa komponen yang harus anda tahu sebelum menggunakan RecyclerView.
  1. RecyclerView dan LayoutManager: Komponen user interface yang bertugas untuk menampilkan data set yang dimiliki di dalamnya terdapat LayoutManager yang mana akan mengatur posisi tampilan data baik itu secara List (Vertikal), Grid (Baris dan Kolom) atau StaggeredGrid (Grid yang memiliki susunan tak seragam / tak beraturan)
  2. Adapter : Komponen yang akan mengatur bagaimana tampilan data set ke dalam RecyclerView. Di sinilah terjadi proses pengisian tampilan (ViewInflate) dari file layout xml untuk tiap elemen dari set data yang dimiliki sebelum dipasang (bind) ke dalam RecyclerView.
  3. Dataset : Kumpulan data yang dimiliki dan ingin ditampilkan bisa berupa Array, List maupun obyek map.
  4. Item Animator  : Ini yang spesial, kita bisa set animasi untuk tiap item di dalamnya bahkan bisa membuat kustomisasi animasi. Contoh animasi yang umum seperti penambahan (add) dan penghapusan (removal) item. Kita akan mempelajari hal ini pada materi terpisah.

Langkah-langkah mengimplementasikan RecyclerView sebagai berikut :
  1. Tambahkan dependencies komponen RecyclerView pada file build.gradle (module: app) level modul.
  2. Tambahkan obyek RecyclerView di file layout xml dari Activity / Fragment.
  3. Definisikan model kelas (POJO) yang akan digunakan sebagai data source.
  4. Buat file layout xml untuk baris item di RecyclerView.
  5. Buat sebuah kelas adapter yang inherit ke RecyclerView.Adapter dan ViewHolder untuk menampilkan tiap elemen data.
  6. Definisikan obyek RecyclerView berikut dengan bentuk yang diinginkan (bisa dalam bentuk list, grid, atau staggered) dan selanjutnya pasang obyek adapter (binding) agar bisa menampilkan koleksi data ke dalam RecyclerView.

Pengenalan Komponen Android Studio: Style and Theme

Pada bagian ini kita akan belajar dengan prinsip desain yang ada di android dan bagaimana mengimplementasikan sebuah struktur yang mendefinisikan tampilan sebuah view dan tampilan komponen aplikasi secara menyeluruh dalam sebuah file style. Prinsip dasar dalam merancang antarmuka aplikasi android harus mematuhi kaidah yang ditetapkan oleh Design Guideline yang dibuat oleh tim Android di Google. Diantaranya adalah sebagai berikut :
  1. Desain diperuntukkan untuk interaksi sentuh.
  2. Menampilkan informasi yang hanya dibutuhkan.
  3. Jika aplikasi meminta izin pengguna untuk melakukan sebuah aksi maka harus disiapkan pula mekanisme agar pengguna dapat membatalkan aksi yang telah dilakukan.
  4. Lakukan interupsi jika diperlukan.
  5. Menampilkan dan mempertahankan teks secara singkat dan prioritaskan penggunaan gambar jika diperlukan untuk lebih deskriptif.
  6. Jaga data pengguna.
  7. Permudah pengguna untuk melakukan sesuatu yang penting secara cepat.
  8. Jika terlihat sama maka harus berperilaku sama.
  9. Bantu pengguna untuk membuat keputusan tapi tetap biarkan pengguna yang menentukan.

Best Practice
Terdapat beberapa langkah-langkah terbaik (best practice) yang harus diperhatikan ketika mengembangkan sebuah aplikasi android, ini korelasi antara User Interface dan menuliskan kode dari sisi logika aplikasi.
  1. Desain yang baik untuk performa aplikasi
    Aplikasi yang dirancang dengan baik harus dapat dijalankan dengan cepat dan jika terdapat proses yang memakan waktu, maka lakukan secara background dan asynchronous
  2. Desain yang baik agar aplikasi dapat bersifat responsif
    Berikan feedback ke pengguna terhadap sebuah aksi yang dilakukan contohnya jika pengguna menekan sebuah tombol di aplikasi maka harus menampilkan efek tekan.
  3. Desain yang mengakomodasi kebutuhan informasi yang dibutuhkan pengguna
    Aplikasi anda harus menampilkan informasi yang dibutuhkan oleh pengguna dan jika diperlukan aplikasi bisa menampilkan informasi terakhir yang diperoleh atau dijalankan sebelumnya sehingga pengguna tidak perlu lagi menunggu aplikasi melakukan load data dari server.
  4. Desain untuk optimasi menggunakan baterai
    Usahakan aplikasi anda menggunakan daya baterai yang kecil. Minimalisir penggunaan dari background service yang tidak perlu dan stop semua listener jika aplikasi tidak sedang dijalankan. Manfaatkan GcmNetworkManager dan JobScheduler jika memang terdapat task yang harus dilakukan secara periodik.
  5. Desain untuk menggunakan koneksi jaringan yang efisien.
    Aplikasi yang baik adalah salah satunya pintar dalam melakukan efisiensi koneksi ke jaringan internet dan memilah-milah mana task yang harus dijalankan pada saat posisi device pengguna terhubung ke wifi (unmetered network) atau pun network lain. Penggunaan koneksi jaringan yang baik akan menjadi hal wajib jika aplikasi andaingin tetap digunakan oleh pengguna.
Ternyata tidak sedikit bukan aturan dalam mengembangkan aplikasi android yang baik. Nilai yang bagus pada poin tampilan akan menopang kualitas fungsi di aplikasi yang anda buat. Jangan sampai fungsi dari aplikasi anda bagus namun secara tampilan jelek dan begitu pula sebaliknya. Pengguna akan mempertahankan aplikasi andadan tetap menggunakannya selama aplikasi anda memang dibutuhkan dan memenuhi poin-poin di atas.  
Kembali lagi pada topik style dan theme. Jika anda pernah mengembangkan sebuah aplikasi berbasis web seharusnya anda sudah tidak asing lagi dengan file CSS (Cascading Style Sheet) yang merupakan sebuah file yang mendefinisikan bagaimana komponen dan tampilan sebuah halaman website. Pendekatan yang serupa juga berlaku di android, ini yang dinamakan style.
Style merupakan sebuah kumpulan property yang dibutuhkan untuk mendefinisikan bagaimana sebuah komponen View dan layar jendela (bisa Activity maupun fragment) ditampilkan seperti property height, width, background_color dan lain sebagainya. Styleterdefinisi dalam file xml sendiri, anda bisa menemukannya di res →  values  →  styles.xml.
Contoh umumnya anda memiliki sebuah TextView yang berisi berbagai attribute seperti ini. Let’s say ini adalah obyek TextViewuntuk menampilkan konten dari detail informasi yang terdapat di keseluruhan aplikasi dan diimplementasikan di banyak file layout xml.
  1. <TextView
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:textColor="#00FF00"
  5. android:typeface="monospace"
  6. android:text="@string/hello" />
Akan sangat tidak efektif jika kita hanya melakukan copy paste dari satu layout xml ke layout xml lainnya yang sebetulnya bisa kita sederhanakan seperti ini :
  1. <TextView
  2. style="@style/CodeFont"
  3. android:text="@string/hello" />
Attribute layout_width, layout_height, textColor, dan typeface bisa kita pindahkan menjadi sebuah style sendiri untuk TextViewtersebut dan dapat digunakan kembali untuk semua obyek TextView sejenis.
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
  4.     <item name="android:layout_width">match_parent</item>
  5.     <item name="android:layout_height">wrap_content</item>
  6.     <item name="android:textColor">#00FF00</item>
  7.     <item name="android:typeface">monospace</item>
  8. </style>
  9. </resources>
Beberapa aturan yang harus diperhatikan ketika kita menggunakan styles yaitu:
  1. Semua style yang dibuat harus berada dalam tag <resources></resources>
  2. Semua style yang ingin didefinisikan harus berada dalam tag <style></style>
    1. <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
    Name       :    Nama dari style yang anda buat.
    Parent     :    Nilai style yang akan mewarisi dari style (berikut dengan attribute di dalamnya) yang telah ada, umumnya bawaan dari sdk ataupun platform. 
    Style yang akan kita warisi akan dapat anda ubah dan tambahkan nilai attribute dalam style baru yang anda buat. Di android sendiri sudah menyediakan beragam style yang bisa anda gunakan untuk beragam tampilan.
  3. Semua attribut yang akan didefinisikan dalam sebuah style harus berada dalam tag <item></item
    1. <item name="android:layout_width">match_parent</item>
    Name                  :    Nama atribut yang ingin didefinisikan.
    Match_parent :    Nilai dari atribut tersebut.

Andaikan dalam satu kasus anda ingin membuat varian dari style yang telah anda buat. Misal untuk style CodeFront anda ingin ada yang berwarna merah anda bisa menambahkan style baru dengan hanya menambahkan prefix dari style sebelumnya dan nama dari style yang baru dipisahkan oleh titik seperti ini :
  1. <style name="CodeFont.Red">
  2. <item name="android:textColor">#FF0000</item>
  3. </style>
atau berwarna merah dan juga dengan ukuran yang besar menjadi seperti ini :
  1. <style name="CodeFont.Red">
  2. <item name="android:textColor">#FF0000</item>
  3. <item name="android:textSize">30sp</item>
  4. </style>

Mudah bukan?  Anda baru saja belajar tentang bagaimana sebuah style dibuat dan diimplementasikan, selanjutnya bagaimana dengan theme?
Theme atau tema itu sendiri merupakan sebuah style yang diimplementasikan khusus untuk Activity dan Application pada file AndroidManifest.xml. Pada project sebelumnya kita mendefinisikannya seperti ini :
  1. android:theme="@style/AppTheme"
Dimana AppTheme pada styles.xml berisi :
  1. <resources>
  2. <!-- Base application theme. -->
  3. <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  4.     <!-- Customize your theme here. -->
  5.     <item name="colorPrimary">@color/colorPrimary</item>
  6.     <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  7.     <item name="colorAccent">@color/colorAccent</item>
  8. </style>
  9. </resources>
Sebuah styles yang inherit ke tema AppCompat untuk varian light dan memiliki DarkActionBar. Semua nilai pada atribut terdapat pada file colors.xml yang berisi
  1. <resources>
  2.     <color name="colorPrimary">#3F51B5</color>
  3.     <color name="colorPrimaryDark">#303F9F</color>
  4.     <color name="colorAccent">#FF4081</color>
  5. </resources>
Saat ini pengembangan aplikasi Android mengacu pada implementasi guideline material design sebagai konsep utama dalam mengembangkan user interface dan user experience. Anda bisa mempelajari lebih lanjut tentang material design di android pada link ini :
Semenjak konsep material design ditetapkan sebagai acuan utama untuk pengembangan user interface dan user experienceterdapat penyederhanaan dalam pendefinisian komponen inti dari atribut yang digunakan. Pada gambar di atas bisa dilihat titik-titik mana saja yang hanya kita gunakan untuk menjadi fondasi dasar tampilan style aplikasi yang kita buat.

Pengenalan Komponen Android Studio: View and ViewGroup

Pada bagian ini anda akan mempelajari lebih dalam tentang konsep dasar pembentukan tampilan antar muka pengguna seperti pemanfaatan komponen berbasis View dan ViewGroup yang berkolaborasi sehingga membentuk sebuah tampilan antar muka pengguna. Contohnya seperti ini,
Keren bukan? Baik, kita mulai saja pembahasannya.
Pada dasarnya semua elemen antar pengguna di aplikasi android dibangun menggunakan dua buah komponen inti yaitu : View dan ViewGroup.
Sebuah View adalah obyek yang menggambar komponen tampilan ke layar yang mana pengguna dapat melihat dan berinteraksi langsung.
Contoh komponen turunan dari View seperti :
  • TextView, komponen yang berguna untuk menampilkan teks ke layar.
  • Button, komponen yang membuat pengguna dapat berinteraksi dengan cara ditekan untuk melakukan sesuatu.
  • ImageView, Komponen untuk menampilkan gambar.
  • ListView, komponen untuk menampilkan informasi dalam bentuk list.
  • GridView, komponen untuk menampilkan informasi dalam bentuk grid.
  • RadioButton, komponen yang memungkinkan pengguna dapat memilih satu pilihan dari berbagai pilihan yang disediakan.
  • Checkbox, komponen yang memungkinkan pengguna dapat memilih lebih dari satu dari pilihan yang ada.
Sedangkan ViewGroup adalah sebuah obyek yang mewadahi obyek-obyek View dan ViewGroup itu sendiri sehingga membentuk satu kesatuan tampilan aplikasi yang utuh. ViewGroup lebih seperti :  
  • LinearLayout
  • FrameLayout
  • RelativeLayout
  • TableLayout

Secara hierarki dalam pembentukan tampilan pengguna, kolaborasi penggunaan antara komponen View dan komponen ViewGroup memungkinkan seperti ini :


Jika diterjemahkan di dalam sebuah ViewGroup akan ditampung dua buah komponen View dan satu komponen ViewGroup yang terdiri dari 3 buah komponen View.
Ya, ini sudah bersifat bertingkat atau nested.
Salah satu contoh dari tampilan dalam file layout xml untuk merepresentasikan kolaborasi View dan ViewGroup seperti ini :
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.               android:layout_width="match_parent"
  4.               android:layout_height="match_parent"
  5.               android:orientation="vertical" >
  6.     <TextView android:id="@+id/text"
  7.               android:layout_width="wrap_content"
  8.               android:layout_height="wrap_content"
  9.               android:text="I am a TextView" />
  10.     <Button android:id="@+id/button"
  11.             android:layout_width="wrap_content"
  12.             android:layout_height="wrap_content"
  13.             android:text="I am a Button" />
  14. </LinearLayout>
Obyek turunan ViewGroup LinearLayout menjadi kontainer untuk obyek turunan View, Button, dan TextView guna membentuk sebuah tampilan melalui file layout xml. Beberapa komponen ViewGroup seperti LinearLayout, RelativeLayout, FrameLayout, dan TableLayout merupakan komponen yang paling banyak digunakan untuk menjadi parent / root dari komponen-komponen View di dalam sebuah tampilan aplikasi android. Berikut adalah definisi singkat dan inti dari komponen-komponen tersebut terhadap penempatan komponen View (child) di dalamnya.

LinearLayout
Akan menempatkan komponen-komponen di dalamnya secara horizontal atau vertikal. LinearLayout memilikiatribut weight untuk masing-masing child view yang berguna untuk mengontrol porsi ukuran view secara Relatif dalam sebuah  ruang (space) yangtersedia.
           android:orientation=”vertical”                      android:orientation=”horizontal”

RelativeLayout
Layout yang paling fleksible dikarenakan posisi dari masing-masing komponen di dalamnya dapat mengacu secara relatif pada komponen yang lainnya dan juga dapat mengacu secara relatif ke batas layar.
FrameLayout
Layout ini adalah layout yang paling sederhana. Layout ini akan membuat komponen yang ada di dalamnya menjadi menumpuk atau saling menutupi satu dengan yang lainnya. Komponen yang paling pertama pada layout ini akan menjadi bagian bawah dari komponen-komponen di atasnya. Pada materi penggunaan fragment di materi sebelumnya, FrameLayout memiliki kemampuan untuk menjadi kontainer buat fragment-fragment di dalam sebuah Activity. Berikut ilustrasi dari penggunaan FrameLayoutterhadap child view yang dimiliki di dalamnya.

TableLayout    
Susunan komponen di dalam TableLayout akan berada dalam baris dan kolom. Namun jangan berharap layout jenis ini akan menampilkan garis pembatas untuk baris, kolom atau cell-nya menggunakan konsep yang sama pada pengembangan aplikasi berbasis web.   

Jika anda sadari sebetulnya perbedaan dari masing-masing layout yang dijelaskan di atas terletak pada susunan komponen view di dalamnya. Itu saja.
Lalu pertanyaannya kapan kita menggunakan LinearLayout, RelativeLayout, FrameLayout, dan TabletLayout ? jawabannya adalah relatif tergantung pada kebutuhan dan performa.
Salah satu tips performa dari aplikasi android adalah dengan membuat susunan hierarki layout dalam sebuah file layout xml secara sederhana dan flat dalam artian kedalaman penggunaan nested layout atau layout bersarang tidak terlalu dalam. Selain itu, pemahaman yang baik terhadap dasar-dasar pembangunan UI di android, pengalaman, feeling, dan selalu mencari tahu best-practice seperti apa.
Semua tergantung latihan dan seberapa sering kita berhadapan dengan kasus-kasus melakukan transformasi UI dari bentuk mockup ke dalam bentuk kode xml di Android.
Dengan membiasakan melakukan penulisan kode sisi UI di xml tanpa penggunaan drag and drop akan membentuk pola pikir dan feeling kita dalam membangun dan mentransformasi UI ke dalam bentuk yang dibutuhkan. Ini bersifat Relatif, mungkin cara membentuk UI dari satu developer android dengan developer android lainnya akan berbeda.

Kelemahan dari layout-layout tersebut adalah ketidakmampuan untuk melakukan scroll konten secara vertikal atau horizontal. Jelas, adakalanya tampilan aplikasi anda memuat informasi yang panjangnya melebihi layar yang ada, jika hanya bergantung pada layout-layout yang dijelaskan sebelumnya maka tampilan aplikasi anda akan terpotong. Di situlah peran ScrollView membantu untuk memberikan solusi.

ScrollView
Adalah layout yang akan membuat komponen di dalamnya dapat digeser (scroll) secara vertical dan horizontal. Komponen di dalam Scrollview hanya diperbolehkan memiliki 1 parent utama dari LayoutLinear, RelativeLayout, FrameLayout, atau TableLayout.

Satuan Dimensi di Android
Platform Android dikenal karena keberagamannya, dari mulai ukuran device, layar, spesifikasi, hingga level operating system-nya. Karena keberagaman tersebut tak heran jika dibutuhkan tampilan yang konsisten agar aplikasi kita bisa berjalan dan tampil maksimal khususnya di beragam jenis layar device android yang beredar di pasaran. 
Android sendiri memiliki satuan unit dimensi untuk ukuran tinggi dan lebar sebuah komponen View atauViewGroup. Berikut adalah esensi dari satuan dimensi unit di android. 
  1. Ekosistem android dikenal dengan fragmentasi spesifikasi device yang sangat bervariasi termasuk perbedaan dimensi layar dan kerapatan pixel (density) dari layar di masing-masing jenis layar device
  2. Untuk tampilan yang konsisten di handset Android terdapat satuan untuk dimensi dan ukuran dari teks yaitu : dip/dp(density-independent pixel) dan sp (scale-independent pixels).
  3. Satuan dp/dip digunakan untuk satuan dari nilai dimensi misal width (attribut : layout_width) dan height (attribut : layout_height) dari sebuah komponen View atau ViewGroup.
  4. Satuan sp digunakan untuk ukuran teks. Perbedaannya dengan dp / dip adalah satuan sp android akan men-scale ukuran teks sesuai dengan setting ukuran teks di device (yang biasa dapat di akses melalui menu settings)

Contoh 1 :
Misalkan ada dua tablet 7-inch (ukuran diagonal layar), tablet pertama (A) memiliki resolusi layar 1200x1920px 320dpi dan yang lainnya (B) beresolusi 2048x1536px 326dpi. Membuat button dengan ukuran 300x300px mungkin akan tampak normal pada tablet A tapi akan tampak kecil di tablet B.
Tapi akan berbeda jika kita spesifikasikan ukuran button-nya dengan ukuran yang bergantung pada density layar alias menggunakan dip misal 300x300dp. Secara fisik ukuran button tersebut akan selalu sama pada ukuran layar yang berbeda.

Contoh 2 :
Pada gambar di atas ukuran 200dp akan dikonversi pada device mdpi (device dengan density 160dpi/dots per inch) menjadi 200px dan menjadi 400px pada device xhdpi (density 420dpi) misal pada nexus 4. Sehingga ukuran tersebut tampak sama dan konsisten secara fisik untuk beragam device dengan ukuran layar yang berbeda.

Pengenalan Komponen Android Studio: Activity dan Intent

Kali ini kita akan belajar tentang komponen-komponen dasar yang digunakan untuk membuat aplikasi android yang sederhana.
Beberapa komponen diantaranya adalah :
  1. Activity
  2. Intent
Teori
  1. Activity merupakan sebuah komponen di Android yang berfungsi untuk menampilkan User interface ke layar handset Android Pengguna. Ini seperti pada saat anda melihat list chat  pada aplikasi WhatsApp atau list email pada aplikasi Gmail di ponsel android anda.
  2. Umumnya dalam sebuah aplikasi terdapat lebih dari satu Activity yang saling terhubung dengan tugas yang berbeda-beda.
  3. Activity merupakan salah satu komponen penting Android yang memiliki daur hidup (Lifecycle) dalam sebuah stack pada virtual sandbox yang disiapkan oleh Dalvik Virtual Machine (DVM) atau Android Runtime (ART) yang bersifat Last In First Out.
  4. Pada implementasinya, Activity selalu memiliki satu layout user interface dalam bentuk file xml.
  5. Sebuah aplikasi android bisa memiliki lebih dari satu Activity dan harus terdaftar di file AndroidManifest.xml sebagai sub Aplikasi (pada tag )
  6. Sebuah class Java dinyatakan sebuah Activity jika mewarisi (extends) superclass Activity atau turunannya seperti AppCompatActivity atau FragmentActivity.

Untuk lebih mendalami tentang Activity, kami menyarankan anda untuk membaca referensi berikut :

Activity Lifecycle
201609211453443ec948a46aa87264bbf9fb0e3c
Developer yang baik, harus mengetahui secara detail tentang lifecycle sebuah Activity untuk melakukan aksi yang tepat, terutama ketika terjadi perubahan state dari Activity. Callback methods yang ada dapat digunakan untuk melakukan beragam proses terkait state dari Activity. Misal melakukan semua inisialisasi komponen di onCreate(), melakukan disconnect terhadap koneksi ke server pada onStop() atau onDestroy() dan lain sebagainya. Pemahaman yang baik tentang daur hidup Activity akan membuat implementasi fungsi dari rancangan aplikasi anda menjadi lebih baik. Hal ini juga meminimalisir terjadinya error/bug/force close yang tidak diinginkan.

Last In, First Out (LIFO)

Gambar 1
Gambar 2
Gambar 3
Aktif: Activity 1
onCreate() → onStart() → onResume()
Aktif: Activity 2
Stack append: Activity 2 [ onResume() ]
Activity 1
onStop() → onRestart() → onStart() → onResume()
Aksi: Klik Button1 (Pindah)
Aksi: Klik Hardware Back Button
Aktif: Activity 1
Stack append: Activity 1 [ onStop() ]
Activity 2 [ finish() ]
Stack pop: Activity 2 [ onDestroy() ]

Gambar 1: Jika anda memiliki sebuah aplikasi yang terdiri dari 2 Activity. Activity pertama dijalankan setelah pengguna meluncurkan aplikasi anda melalui icon aplikasi di layar device. Activity yang ada saat ini berada pada posisi Activity running setelah melalui beberapa state onCreate() → onStart() → onResume() dan masuk ke dalam sebuah stack Activity.
Bilamana dari Activity pertama anda menjalankan Activity kedua melalui klik sebuah tombol (button); posisi state dari Activitypertama anda, berada pada posisi stop dan method callback onStop() akan dipanggil. Ini terjadi karena Activity sebelumnya sudah tidak berada pada layar foreground / tidak lagi ditampilkan namun semua informasi terakhir pada Activity pertama akan disimpan secara otomatis. Activity kedua masuk ke dalam stack dan menjadi Activity terakhir yang masuk.
Gambar 2: Activity kedua sudah muncul di layar sekarang. Lalu dari Activity kedua ini anda menekan tombol back pada physical button menu utama atau memanggil method finish() maka Activity kedua anda akan di pop up keluar dari stack dan state Activity ini akan berada pada destroy, tentunya method onDestroy() akan dipanggil. Inilah mengapa disebut Last In, First Out.Activity kedua menjadi yang terakhir masuk stack dan yang paling pertama keluar dari stack.
Gambar 3: Activity Pertama akan dimunculkan kembali di layar setelah melalui beberapa state dengan rangkaian callback method yang terpanggil, onStop() → onRestart() → onStart() → onResume().
Detailnya dapat anda baca disini :

Saving Activity State
Ketika sebuah activity mengalami onPause kemudian onResume maka state dari sebuah activity tersebut dapat terjaga. Ini karena obyek Activity masih tersimpan di memory sehingga dapat dikembalikan statenya. Dengan menjaga state dari Activity tersebut maka perubahan pada Activity yang dilakukan oleh user ketika activity kembali ke foreground atau onResume akan tetap seperti saat user berpindah activity bahkan berpindah aplikasi.
Akan tetapi ketika sistem menghancurkan Activity untuk keperluan memori (misalnya karena memori habis), maka obyek activity dihancurkan. Dengan dihancurkannya sebuah obyek Activity maka ketika Activity ingin ditampilkan kembali diperlukan proses re-create activity yang dihancurkan. Karena ada kemungkinan terjadinya proses tersebut maka perubahan yang dilakukan pada activity perlu disimpan terlebih dahulu. Disinilah method onSaveInstanceState() digunakan.
Dalam onSaveInstanceState terdapat bundle yang dapat digunakan untuk menyimpan informasi dengan memanfaatkan fungsi seperti putString() dan putInt(). Bundle dikirimkan pada onCreate dan onRestoreInstanceState ketika Activity di-restart. Dengan menggunakan bundle yang dikirimkan maka activity dapat mengisi kembali perubahan yang terjadi saat onCreate atau dengan meng-override onRestoreInstanceState.
Proses penghancuran aplikasi bukan hanya pada saat ketika sistem menghancurkan activity karena membutuhkan memori untuk proses lain; akan tetapi terjadi juga ketika terjadi perubahan konfigurasi seperti orientation changes, keyboard avalaibility, dan language. Beberapa proses tersebut ketika terjadi akan menjalankan onDestroy kemudian langsung memanggil onCreate. Behavior tersebut dimaksudkan agar activity dapat menyesuaikan dengan konfigurasi yang baru seperti menyesuaikan ukuran layar.
Hal yang perlu diingat ketika menggunakan onSaveInstanceState adalah Bundle tidak diperuntukkan menyimpan data yang besar seperti bitmaps dan Bundle harus melalui proses serialize serta deserialize yang akan memakan memori.
Intent adalah mekanisme untuk melakukan sebuah action dan komunikasi antar komponen aplikasi misal Activity, Services, dan Broadcast Receiver. Ada tiga penggunaan umum Intent dalam aplikasi Android yaitu:
  • Memindahkan satu Activity ke Activity lain dengan atau tidak membawa data.
  • Menjalankan background Service misal melakukan sinkronisasi ke server dan menjalankan proses berulang (periodic/scheduler task).
  • Mengirimkan obyek broadcast ke app yang membutuhkan. Misal jika aplikasi membutuhkan proses menjalankan sebuah background service setiap aplikasi selesai melakukan booting. Aplikasi harus bisa menerima obyek Broadcast yang dikirimkan oleh sistem Android untuk event booting tersebut.

Intent memiliki dua bentuk yaitu:
  • Explicit Intent adalah tipe intent yang digunakan untuk menjalankan komponen dari dalam sebuah aplikasi. Explicit intent bekerja dengan menggunakan nama kelas yang dituju misal : com.dicoding.activity.DetailActivity. Umumnya intent ini digunakan untuk mengaktifkan komponen pada satu aplikasi.
  • Implicit Intent adalah tipe intent yang tidak memerlukan detail nama kelas yang ingin diaktifkan, ini memungkinkan komponen dari aplikasi lain bisa merespon request intent yang dijalankan. Penggunaan tipe Intent ini umumnya diperuntukan untuk menjalankan fitur/fungsi dari komponen aplikasi lain. Contohnya ketika kita membutuhkan aplikasi kita untuk mengambil foto, daripada kita harus membuat sendiri fungsi kamera lebih baik kita menyerahkan proses tersebut pada aplikasi kamera bawaan dari device atau aplikasi kamera lain yang telah terinstal sebelumnya di device atau juga jika kita membutuhkan untuk fungsi berbagi konten, kita bisa memanfaatkan intent untuk menampilkan mana saja aplikasi yang bisa menawarkan fungsi berbagi (share) konten. Implementasi Intent Implicit ini akan sangat memudahkan bagi pengembang agar tetap fokus pada proses bisnis inti dari aplikasi yang dikembangkan.