ANDROID



hai..hai.. hai... apa kabara guys... ada pertanyaan Apa itu Android? Android adalah sistem operasi yang dikeluarkan oleh Google khususnya untuk smartphone dan tablet. Berbagai macam produsen telah menggunakan Android sebagai sistem operasi untuk device yang mereka produksi. Android juga mempunyai store dimana terdapat 1 miliar pengguna aktif.



Mengapa Android? Muncul pertanyaan kenapa menggunakan Android ? Android memanjakan penggunanya dengan fiturnya yang sangat canggih seperti tampilan ui yang bagus baik dari segi user interface dan user experience, dapat digunakan sebagai alat multimedia seperti pemutar musik dan video, dan juga menggunakan perangkat keras seperti akselerometer, gyroscope dan sensor lainnya ke dalam aplikasi. Disamping itu ada beberapa hal yang membuat Android sebagai sistem operasi yang memang layak digunakan oleh pengguna atau dikembangkan oleh para developer, seperti yang akan dijelaskan berikut ini.

Sistem Operasi SmartphoneTerpopuler

Sejak direlease pada tahun 2008, Android mengeluarkan beberapa versi dan hingga saat ini yang terbaru adalah Nougat yang di release pada tahun 2016. Pada tahun 2013 Android menjadi best-selling OS pada tablet dan menjadi os yang majoritas digunakan oleh pengguna smartphone. Tercatat pada tahun 2016 store Android memiliki lebih dari 2.7 juta aplikasi dan lebih dari 2 miliar penggunaaktif tiap bulannya.

Android menarik untuk para perusahaan teknologi yang membutuhkan barang siap jadi, biaya rendah dan kustomisasi os untuk perangkat teknologi tinggi mereka. Dengan beberapa kelebihan tersebut membuat perusahaan-perusahaan besar mengeluarkan produknya dengan menggunakan sistemoperasi Android.

Source code dari Android dikeluarkan oleh Google dengan memiliki lisensi open source, sehingga menarik para komunitas developer dan entusias untuk menggunakannya dalam project komunitas.

Store

Aplikasi Android bisa di distribusikan dengan menggunakan web, copy apk, email dan store. Store Android yaitu Google Play merupakan cara termudah bagi para developer untuk medistribusikan aplikasinya ke pasar yang memiliki jutaan pengguna.

Google play merupakan store resmi Android yang dikelola oleh Google, pengguna bisa mencari dan download aplikasi yang di kembangkan dengan menggunakan Android Software Development Kit. Disamping aplikasi beberapa servis yang ditawarkan di dalam Google Play adalah media digital, music, buku, majalah, film dan program televisi.

Bagaimana para developer memonetisasi aplikasi yang ada di dalam Google Play? Strategi monetisasi aplikasi yang di tawarkan Google Play bermacam-macam dimulai dari paid distribution (app berbayar), in-app produk, subscriptions, dan ads. Tentunya developer harus mengikuti aturan yang ada untuk memastikan bahwa pengguna mendapatkan user experience yang paling bagus.


Development Kit untuk developer

Android Software Development Kit (SDK) merupakan kit yang bisa digunakan oleh para developer untuk mengembangkan aplikasi berbasis Android. SDK di dalamnya terdapat beberapa tools untuk mengembangkan aplikasi seperti debugger, software libraries, emulator, dokumentasi, sample code dan tutorial.

Bahasa pemrograman yang sering digunakan untuk mengembangkan aplikasi Android adalah Java, namun ada beberapa Bahasa lainnya yang juga support untuk mengembangkan aplikasi Android seperti C++, dan Go. Dan pada Google IO 2017 menjadikan Kotlin sebagai Bahasa yang disupport resmi oleh Google.



Berbicara tentang pemrograman tentunya tidak lepas dari Integrated Development Environment(IDE) yang bisa dipakai oleh para Developer. Pada 2014 Google mengeluarkan IDE yang bernama Android Studio yang berbasikan dari Intellij IDEA. Dengan menggunakan Android Studio para developer dapat membuat aplikasi dari nol hingga publish ke dalam store. Android Studio juga mempunyai beberapa fitur built-in yang sangat membantu para developer untuk memaksimalkan proses pembuatan aplikasi seperti Gradle, Code Completion, dan terintegrasi dengan beberapa services dari Google seperti Firebase.


Java

Salah satu Bahasa yang bisa digunakan untuk development Android adalah Java. Selain Java ada beberapa Bahasa lain yang bisa digunakan seperti C/C++, Go, dan pada May 2017 Google resmi support Kotlin.


Pada akademi ini kita hanya akan fokus menggunakan Java sebagai Bahasa pemrograman yang digunakan. Oleh karena itu maka kita install dulu software yang harus kita gunakan untuk coding (menuliskan baris code), siapkan senjata Anda sebelum berperang.


Yang harus diinstall adalah Java Development Kit yang bisa kita dapatkan pada link berikut: 
http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 


Biasanya muncul pertanyaan? Apakah JRE cukup? Tidak, JRE adalah Java Runtime Environment yang berfungsi sebagai Virtual Machine untuk menjalankan program Java. Sedangkan JDK merupakan Java SE Development Kit, dimana JRE juga di ada di dalamnya. Dan yang lebih penting adalah di dalamnya terdapat compiler dan tools untuk membuat dan compile program.

Sederhananya JRE untuk menjalankan program, JDK untuk membuat program.


Mari kita mulai dengan proses instalasi dari JDK.


Langsung saja buka link di atas menggunakan browser Anda, dan pilih Java Platform (JDK), tampilan dari layout download dari JDK.

Lalu pilihlah yang sesuai dengan device dan os yang Anda pakai.

Setelah proses download selesai, langsung install ke device Anda dan ikuti petunjuknya sampai selesai. 


Android Studio

Pada akademi kali ini kita akan menggunakan Android Studio sebagai IDE (Integrated Development Environment). Android Studio di release 16 May 2013 pada Google IO. Android Studio berbasiskan JetBrains Intellij IDEA, dan dikhususkan untuk mengembangkan software berplatform Android.


Untuk Android Studio bisa download dari website resmi google : 
https://developer.android.com/studio/index.html 


Mari langsung saja kita mulai instalasi dari Android Studio. 
Tampilan dari laman download Android Studio. 





Ikuti petunjukknya sampai selesai. 


Tampilan jendela pertama kali ketika Android Studio. Untuk memulai project baru pilihlah “Start a new Android Project”.



Dalam dialog ini kita bisa memberi nama dari aplikasi kita, dan company domain. Company domain akan di gunakan dalam identifikasi unik dari aplikasi kita ketika sudah di-publish. Kita juga dapat mengganti dari direktori dimana project kita akan disimpan.

Dialog selanjutnya adalah target devices, di dalam dialog ini kita bisa memilih target devices dari aplikasi yang akan kita buat. Kita juga bisa mengganti nilai minimum SDK yang akan di 
kover oleh aplikasi kita.
Dialog selanjutnya adalah default template. Terdapat beberapa template yang bisa kita gunakan seperti Empty Activity, Login Activity, Navigation Drawer Activity, dan lain-lain.

4. Dialog selanjutnya adalah nama dari activity yang pertama kali kita buat.





Android Manifest


Manifest adalah salah satu file yang harus ada di dalam sebuah project Android. Manifest berfungsi sebagai file yang memberikan informasi penting dari sebuah aplikasi ke sistem Android. Sistem perlu mengetahui apa yang akan digunakan oleh aplikasi sebelum bisa mulai dijalankan.


Beberapa fungsi yang ada di dalam manifest adalah sebagai berikut. 
Nama Package

1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"


2. package="com.dicoding.myapplication">


Package name merupakan sebagai identitas unik dari sebuahaplikasi. Identitas ini juga yang akan digunakan di dalam store untuk membedakan suatu aplikasi dengan aplikasi lainnya. Jangan pernah mengganti value di dalam package karena nantinya akan dikenali sebagai aplikasi yang lainjika sudah masuk ke dalam store. 
Komponen Aplikasi
Berfungsi untuk mendiskripsikan komponen dari aplikasi mulai dari activity, services, broadcast receiver, dan content provider.


1. <application
2. android:allowBackup="true"
3. android:icon="@mipmap/ic_launcher"
4. android:label="@string/app_name"
5. android:roundIcon="@mipmap/ic_launcher_round"
6. android:supportsRtl="true"
7. android:theme="@style/AppTheme">
8. <activity android:name=".MainActivity">
9. <intent-filter>
10. <action android:name="android.intent.action.MAIN" />
11. 
12. <category android:name="android.intent.category.LAUNCHER" />
13. </intent-filter>
14. </activity>
15. 
16. <service
17. android:name=".MyIntentService"
18. android:exported="false" />
19. 
20. <receiver
21. android:name=".MyReceiver"
22. android:enabled="true"
23. android:exported="true"></receiver>
24. </application>

Komponen aplikasi semuanya berada di antara tag <application>. Disini juga berfungsi sebagai penamaan kelas yangmeng-implement komponen dan mendeskripsikan kemampuannya seperti intent-filter, dimana fungsinya mendeskripsikan bahwa komponen itu adalah yang pertama kali dijalankan. 
Permission
Mendeklarasikan permission apa saja yang harus dimiliki oleh aplikasi untuk akses ke dalam komponen API seperti internet, external storage, contact, dan juga untuk berinteraksi kepada aplikasi lainnya. 


Gradle

Gradle merupakan open source build automation system. Automation system berguna untuk mengotomatisasi proses pembuatan dari software build dan proses-proses terkait lainnya termasuk compile source code menjadi binary code, packaging binary code, dan menjalankan automated test.



build.gradle (Project: MyApplication)


Merupakan software build tingkat teratas yang meliputi keseluruhan dari project dari sebuah aplikasi. Di dalamnya berisi konfigurasi semua modul yang ada di dalam project.


build.gradle (Module: app)


Merupakan software build yang ada pada setiap modul di dalam project sebuah aplikasi. Beberapa konfigurasi yang di edit di antaranya adalah android settings, defaultConfig dan productFlavors, buildTypes, dan dependencies.


1. apply plugin: 'com.android.application'
2. 
3. android {
4. compileSdkVersion 25
5. buildToolsVersion "25.0.2"
6. defaultConfig {
7. applicationId "com.dicoding.myapplication"
8. minSdkVersion 21
9. targetSdkVersion 25
10. versionCode 1
11. versionName "1.0"
12. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13. }
14. buildTypes {
15. release {
16. minifyEnabled false
17. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18. }
19. }
20. }
21. 
22. dependencies {
23. compile fileTree(dir: 'libs', include: ['*.jar'])
24. androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
25. exclude group: 'com.android.support', module: 'support-annotations'
26. })
27. compile 'com.android.support:appcompat-v7:25.3.1'
28. compile 'com.android.support.constraint:constraint-layout:1.0.2'
29. testCompile 'junit:junit:4.12'
30. } 

Android Settings
Di dalam block android kita bisa menetapkan compileSDKVersion dan buildToolsVersion. 
Default Config
Di dalamnya terdapat properties seperti applicationID, minSdkVersion, targetSdkVersion dan test information. 
Build Types
Di dalamnya terdapat properties dari debuggable, ProGuard enabling, debug signing, version name suffix dan test information. 
Dependencies
Di dalamnya terdapat `informasi tentang library yang digunakan oleh aplikasi. 


Sync Project

Setiap kali terjadi perubahan informasi di dalam build.gradle maka kita harus melakukan sinkronisasi terlebih dahulu. Tombol sync now akan muncul pada sebelah kanan atas ketika terjadi perubahan.



Setelah proses sinkronisasi selesai maka akan muncul informasi pada log apakah proses sinkronisasi berhasil atau tidak.

Testing aplikasi sudah merupakan kewajiban yang harus dilakukan oleh seorang developer. Proses running atau debugging bisa dilakukan dengan dua cara yaitu dengan emulator atau device asli. Baik emulator atau device asli memiliki kelebihan dan kekurangan masing-masing, kita sebagai developer tinggal memilih mana yang sesuai dengan keperluan kita.

Running menggunakan emulator

Ikuti langkah-langkah berikut untuk run aplikasi kita dengan menggunakan emulator built-in dari Android Studio.


Jalankan icon run, kemudian akan muncul dialog seperti ini. Mari kita coba buat emulator baru dengan memilih Create New Virtual Device.
Akan muncul dialog dengan pilihan beberapa emulator device yang bisa langsung anda gunakan.
Jika anda ingin membuat spesifikasi hardware sendiri bisa dengan memilih pilihan New Hardware Profile. Maka akan muncul dialog seperti dibawah ini.


Konfigurasi hardware terserah dengan preferensi dari pengguna, yang perlu diingat adalah gunakanlah konfigurasi emulator yang sesuai dengan kemampuan dari laptop atau computer yang Anda gunakan. Run emulator perlu di perhatikan karena emulator akan memakan resource yang cukup lumayan banyak.



Anda dapat membuat hardware emulator baru atau bisa juga memilih dari hardware emulator yang sudah ada. Setelah memilih hardware emulator langsung ke langkah selanjutnya yaitu akan muncul dialog seperti ini.


Pada dialog ini anda akan memilih versi android dari emulator yang akan anda buat. Pada dialog diatas dipilih versi yang sudah terdownload yaitu Nougat. Tombol download di sebelah kanan versi menunjukkan bahwa anda perlu men-download-nya terlebih dahulu jika ingin menggunakannya.







Selanjutnya klik Next, dan akan muncul dialog verify configuration. Pada dialog ini anda bisa sekali lagi memverifikasi configurasi dari emulator yang anda pilih. 
Di bawah kiri ada tombol Show Advanced Settings, coba anda klik dan akan muncul tampilan dialog baru seperti ini.
Dari tampilan advanced setting anda bisa kustomisasi hardware yang telah kita pilih sebelumnya. 
Jika sudah selesai klik finish dan langsung launch emulatornya dengan menekan tombol hijau yang ada di sebelah kanan.
Okay, selesai setting emulatornya dan bisa langsung dijalankan.
Catatan : 
Jika muncul warning bahwa haxm not installed bisa langsung download dengan mengikuti link download yang disediakan.
Jika muncul warning bahwa VT-x disabled in BIOS maka anda perlu restart komputer anda, kemudian masuk ke layar BIOS, dan ubah virtualization-nya menjadi enabled. 


Run dengan device


Untuk run atau debugging yang paling disarankan kepada para developer adalah dengan menggunakan device smartphone asli. Run dengan menggunakan device memiki beberapa kelebihan jika dibandingkan dengan emulator yaitu : 
Lebih cepat 
Fitur seperti geo-location, push notif bisa digunakan 
Bisa mengetahui daya serap baterai terhadap aplikasi 
Lebih mudah 

Dengan menggunakan device smartphone asli maka kita dapat mengetahui keadaan (environment) aplikasi ketika dijalankan di device asli. Dengan memastikan bahwa aplikasi kita berjalan secara wajar di device asli maka sudah cukup memberikan jaminan kepada aplikasi kita ketika nantinya di pasarkan (store). Akan tetapi kadang kala dengan hanya run di satu device belum cukup untuk merepresentasikan berjalannya aplikasi kita di store, dikarenakan banyaknya model device Android yang ada di pasaran saat ini. Tapi kita tidak akan membahas masalah ini di dalam akademi kita. 


Mari ikuti langkah-langkah berikut untuk run atau debug di dalam device. Tampilan dari langkah berikut bisa dipastikan akan berbeda dengan device yang Anda pakai, akan tetapi secara garis besar langkahnya akan sama meskipun berbeda device



Pastikan device yang akan dipakai sesuai dengan target SDK atau paling tidak min SDK version dari aplikasi kita. 
Buka setting dan masuk ke dalam menu About. Di dalam about cari informasi tentang build number.


Kemudian tekan build number sebanyak 7 kali. 








Kembali ke menu setting di awal dan akan muncul menu baru di bawah about yaitu Developer Options. Selamat anda sudah resmi menjadi seorang Developer Android. 







Masuk ke dalam menu Developer options dan pastikan opsi USB Debugging Mode sudah nyala.
Oke selesai setting pada device langsung saja koneksikan dengan laptop atau computer yang anda pakai. 


Hal terakhir setelah mengembangkan aplikasi di Android adalah membuat file executable dalam bentuk format APK (Android Application Package) yang dapat didistribusikan agar aplikasi kita dapat sampai ke tangan pengguna. Jika kamu belum mengerti tentang apk, ini seperti file exe di windows atau ipa di iOS yang akan didapatkan oleh pengguna untuk melakukan instalasi (pemasangan) aplikasi di device android. File inilah yang akan nantinya kamu upload ke Google Play agar pengguna bisa mendownload aplikasi kamu. Kelebihan dari file apk ini adalah kemampuannya untuk didistribusikan melalui non market aplikasi, bisa melalui website, email, bahkan flashdisk. Namun, jika aplikasi mu ingin lebih menjangkau lebih jauh pengguna disarankan tetap melakukan publish aplikasi kamu ke Google Play Store.


Cara membuat file apk di android pun cukup mudah via wizard atau via command line. Pada sesi kali ini kita akan memfokuskan pada penggunaan wizard untuk melakukan proses generate apk yang akan kita bagi menjadi dua : 
Dengan menggunakan default keystore 
Dengan menggunakan custom keystore 


Sebelum memulai kami yakin kamu masih mempertanyakan tentang ‘mahluk’ bernama keystore itu seperti apa, baik, keystore adalah sebuah file binary yang berisi informasi tentang satu atau lebih private key. Ini lebih mengarah pada konsep pengamanan apk yang kita buat yang di generate dengan sertifikat berbasis public dan private key. Konsep umumnya sebagai berikut : Sistem operasi android membutuhkan semua apk di signed / digenerate dengan menggunakan sebuah sertifikat sebelum aplikasi atau apk-apk tersebut dipasang ke dalam device. Proses penggunaan public dan private key berlangsung selama developer melakukan generasi (signed) apk untuk versi debug maupun untuk versi production (release). Sebuah sertifikat digital public key atau juga disebut identify certificate berisi informasi tentang dirinya sendiri dan private key yang bisa digunakan dan juga termasuk metadata dari pemilik certificate tersebut dalam hal ini developer yang melakukan proses pembuatan aplikasi. Public key ini secara otomatis akan dilampirkan dalam file apk ketika proses signed/generate apk dilakukan oleh gradle melalui signing tools yang disediakan oleh android studio. Public key bersifat identifier unik yang hanya berasosiasi dengan file project android yang digunakan dan file keystore terkait. Selain untuk menjaga keamanan dari apk yang dibuat ini juga akan termasuk pada konsistensi dan menjaga originalitas ketika apk diupdate di Google Play Store. Ingat apk hanya bisa diupdate jika keystore pertama kali upload sama dengan keystore ke n kali upload. Kegunaan keystore sangat banyak dua diantaranya yang paling terpenting ialah : 
Untuk integrasi ke layanan Google seperti Google Maps dengan menggunakan nilai hash (diggest SHA1) didalamnya. 
Untuk integrasi ke layanan api facebook dengan menggunakan keyhash base64 yang terkandung didalam keystore. 


Keystore merupakan sebuah file penting yang kamu harus benar-benar bisa menjaga, terlebih jika aplikasi buatan kamu adalah calon-calon aplikasi dengan jumlah download yang besar dan memberikan manfaat banyak. Karna kalau kamu lalai akibatnya adalah file apk kamu tidak dapat terupdate dan hal terburuknya kamu harus melakukan dari awal lagi. Berikut adalah tips yang bisa kamu pahami untuk mengamankan keystore : 
Plih password yang sulit ditebak, kombinasikan angka, alphabet dan simbol dalam membuatnya. 
Bedakan antara keystore password dan keypassword ketika membuat file apk dengan kustom keystore. 
Jangan memberikan keystore kepada orang yang tidak dipercaya apalagi kamu meletakannya didalam file project aplikasi. 


Letakan ditempat yang kamu ingat dan pastikan aman.


Seperti biasa untuk membuat kamu lebih paham tentang ini kami menyarakan kamu untuk membaca materi lanjutan di tautan berikut : 
App Signing 


Jika kamu ingin menemukan dimana default keystore kamu yang berupa debug.keystore kamu bisa mendapatkannya di ~/.android/debug.keystore Pada mac dan C:\User\YourUser\.android\debug.keystore pada windows.


Tenang pada latihan kali ini kita sama sekali tidak melakukan pengkodean. Mari kita mulai dengan yang pertama :






Buka salah satu project android associate favoritmu, misal My Broadcast Receiver. 
Sekarang klik menu Build → Build APK
Lalu perhatikan secara otomatis pada status bar gradle akan menjalankan sebuah proses untuk melakukan proses generate apk. Proses ini bergantung pada seberapa kompleks aplikasi kamu dan seberapa banyak dependensi dengan library yang kamu gunakan. 
Ketika berhasil maka di sudut kanan atas android studio kamu akan muncul notifikasi sebagai berikut :


Sekarang tinggal kamu klik link yangterdapat pada notifikasi tersebut dan secara otomatis akan diarahkan dimana file apk tersebut berada biasanya pada struktur seperti berikut project-name/module-name/build/outputs/apk/dan jika disesuaikan dengan project yang sedang digunakan maka akan menjadi sepertiberikut MyBroadcastReceiver/app/build/outputs/apk/apk-debug.apk
























Tadaaaa… sekarang kamu sudah berhasil membuat apk dengan menggunakan default keystore. Ingat, apk yang baru saja kamu generate akan ditolak oleh Google Play Store jika kamu mencoba mengupload dan publish ke Google Play Store. Agar dapat diterima oleh Google Play Store kamu harus melakukan signed atau generate dengan menggunakan kustom keystore. 
Sekarang coba kamu pindahkan file apk yang barusan kamu buat ke dalam device kamu (tentunya dengan yang sebelumnya kamu copot (uninstall) terlebih dahulu) dan dengan file explorer pada device kamu, temukan dan lakukan instalasi aplikasi seperti biasa dan whoillaaa aplikasi android kamu bisa terinstal di device! File ini bisa kamu berikan ke kakak, nenek, mbah atau opung kamu untuk memamerkan kalau kamu sudah bisa bikin aplikasi di Android yeahh. 
Mudah bukan ? Sekarang kita lanjut membuat apk dengan kustom keystore. 
Langkah pertama klik Build → Generate Signed APK
Selanjutnya klik next pada dialog dibawah ini : 
Selanjutnya, pilih create new… pada form yang tampil lengkapi isian didalamnya menjadi sebagai berikut (ingat ini hanya contoh)
Berikut penjelasan field per fieldnya : 
Keystore path : Tentukan dimana kamu menyimpan keystore kamu, beri nama dan disini kami membuat folder baru bernama keystore di direktori dicoding 
Password : Isikan keystore password minimail 6 digit dan bedakan dengan keypassword dibawahnya 
Alias : Alias dari keystore 
Password : keypassword 
Validity : Berapa lama kamu keystore kamu akan valid (dalam hitungan tahun) 
Firstname hingga Country Code : Isikan meta data, dan ini penting dengan memberikan data yang valid. 
Setelah selesai klik OK. 
Dialog yang diawal akan secara otomatis terisi ketika kamu sudah berhasil mengisi form sebelumnya. Klik next untuk melanjutkan.
Jika ditanyakan tentang password seperti ini, masukan password yang kamu gunakan untuk device laptop mu.
Selanjutnya tentukan dimana kamu menyimpan apk yang dihasilkan. Disini kami membiarkan secara default. Klik finish untuk memulai signed/generate apk.
Perhatikan pada gradle proses di status bar bagian bawah untuk melihat progress signed/generate apk
Ketika berhasil maka notifikasi seperti berikut akan tampil :
Selamat apk production kamu berhasil digenerate. Ingat, ini dilakukan ketika kamu ingin melakukan upload/reupload plus publish aplikasi kamu di Google Play dan jangan lupa setiap kamu melakukan update aplikasi jangan lupa untuk merubah nilai dari 


1. versionCode 1 (Incremental)


2. versionName "1.0"


Sebelum melakukan upload update aplikasi. Kalau tidak dirubah siap-siap apk baru yang akan kamu upload akan ditolak oleh Google Play Store.


Dalam modul ini kita akan belajar tentang komponen-komponen dasar yang digunakan untuk membuat aplikasi android yang sederhana.


Beberapa komponen diantaranya adalah : 
Activity 
Intent 
Views and ViewGroup 
Style and Theme 
RecyclerView 


Teori 
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. 
Umumnya dalam sebuah aplikasi terdapat lebih dari satu Activity yang saling terhubung dengan tugas yang berbeda-beda. 
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. 
Pada implementasinya, Activity selalu memiliki satu layout user interface dalam bentuk file xml. 
Sebuah aplikasi android bisa memiliki lebih dari satu Activity dan harus terdaftar di file AndroidManifest.xml sebagai sub Aplikasi (pada tag ) 
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 : 
Activities 






Activity Lifecycle






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 Activityini akan berada pada destroy, tentunya method onDestroy() akan dipanggil. Inilah mengapa disebut Last In, First Out.Activitykedua 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 : 
LifeCycle 






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.


· 


Tujuan


Codelab ini bertujuan untuk mengimplementasikan komponen Activity pada aplikasi pertama yang anda bangun sehingga dapat memberikan gambaran tentang bagaimana Activity ditampilkan. Kemudian anda memberikan Interaksi di dalamnya seperti memberi input dan mengklik sebuah tombol.






Logika Dasar


Melakukan input ke dalam obyek TextBox → Melakukan validasi input → Melakukan perhitungan volume balok ketika tombol hitung diklik






Codelab Perhitungan Volume




















Buat Project Baru dengan klik File -> New -> New Project... pada Android Studio anda
Setelah muncul Jendela Create New Project, kemudian atur nama aplikasi dan domain perusahaan/website anda. Sebaiknya jangan sama dengan apa yang ada dicontoh. Dan jangan lupa pula untuk menentukan lokasi project.
Kemudian pilih tipe device untuk aplikasi beserta target minimum SDK yang akan kita gunakan. Pilihan target Android SDK yang kita pilih akan mempengaruhi banyaknya device yang bisa menggunakan aplikasi buatan kita. Disini kita pilih untuk tipe device Phone and Tablet dengan minimum SDK diset ke Level 15 (Ice Cream Sandwich)/ Klik Next untuk melanjutkan.
Pada bagian ini kita akan memilih tipe Activity awal dari template yang telah disediakan. Saat ini Android Studio sudah menyediakan berbagai macam template Activity dari yang paling sederhana hingga yang paling kompleks seperti :
Add No Activity : Tidak ada Activity yang ditambahkan
Basic Activity : Activity dengan template komponen material design seperti FloatingActionButton
Empty Activity : Activity dalam bentuk yang paling dasar
Fullscreen Activity : Activity fullscreen tanpa status bar
Google AdMob Ads Activity : Activity dengan default konfigurasi iklan Admob
Google Maps Activity : Activity dengan menyediakan konfigurasi dasar Google Maps
Login Activity : Activity untuk halaman login
Master / Detail Flow : Activity yang diperuntukan untuk alur aplikasi Master Detail pada device tablet
Navigation Drawer Activity : Activity dengan tampilan side bar menu
Scrolling Activity : Activity dengan kemampuan Scroll konten didalamnya secara vertical
Settings Activity : Activity yang diperuntukan untuk Konfigurasi Aplikasi
Tabbed Activity : Activity yang diperuntukan untuk menampilkan lebih dari satu tampilan, dapat digeser ke kanan dan ke kiri (Swipe) dan dengan menggunakan komponen ViewPager
Saat ini kita pilih tipe Empty Activity, klik Next untuk melanjutkan.


Selanjutnya, tentukan nama Activity pertama kita, saat ini kita biarkan pada kondisi apa adanya. Ingat, jika suatu saat nanti kita ingin melakukan penambahan Activity, best practice nya adalah dengan menambahkan Activity setelah kata nama kelas yang akan kita buat. Misal: ProfileActivity, SettingsActivity dan lain sebagainya. Klik Finish untuk menyelesaikan.
Selamat!, Anda telah berhasil membuat sebuah project baru Android. Layar anda pasti akan seperti dibawah ini:
Di sebelah kanan anda adalah workspace dimana Activity anda berada dan bernama MainActivity.java dengan layoutnya activity_main.xml. Di sebelah kiri anda terdapat struktur project anda dimana nanti kita akan banyak menambahkan berbagai komponen, asset dan library. Untuk lebih mengenal Android Studio lebih dalam silakan baca materi ini https://developer.android.com/studio/intro/index.html 






Selanjutnya kita akan mulai melakukan pengkodean aplikasi atau lebih enaknya disebut ngoding. Berikut flow umumnya.


Ngoding Layout untuk User Interface aplikasi


Ngoding Activity untuk menambahkan logika aplikasi






Jangan ngetik saja atau ngoding polos, Gunakan ctrl + space untuk menggunakan code completion dari Android Studio agar mengoptimasi import package dari komponen yang digunakan.
Dilarang Keras untuk copy - paste! Ngoding pelan-pelan akan membuat anda lebih jago di masa depan.






Selamat ngoding!






Menambahkan Code Sederhana pada Layout Activity 
Silahkan klik tab file activity_main.xml pada workspace anda (res/Layout/activity_main.xml), dan silakan ikuti baris-baris berikut:




1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


2. xmlns:tools="http://schemas.android.com/tools"


3. android:layout_width="match_parent"


4. android:layout_height="match_parent"


5. android:paddingBottom="@dimen/activity_vertical_margin"


6. android:paddingLeft="@dimen/activity_horizontal_margin"


7. android:paddingRight="@dimen/activity_horizontal_margin"


8. android:paddingTop="@dimen/activity_vertical_margin"


9. android:orientation="vertical"


10. tools:context="com.dicoding.associate.barvolume.MainActivity">


11. <TextView


12. android:layout_width="match_parent"


13. android:layout_height="wrap_content"


14. android:text="Panjang"


15. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


16. <EditText


17. android:id="@+id/edt_length"


18. android:layout_width="match_parent"


19. android:layout_height="wrap_content"


20. android:inputType="numberDecimal"


21. android:lines="1"


22. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


23. <TextView


24. android:layout_width="match_parent"


25. android:layout_height="wrap_content"


26. android:text="Lebar"


27. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


28. <EditText


29. android:id="@+id/edt_width"


30. android:layout_width="match_parent"


31. android:layout_height="wrap_content"


32. android:inputType="numberDecimal"


33. android:lines="1"


34. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


35. <TextView


36. android:layout_width="match_parent"


37. android:layout_height="wrap_content"


38. android:text="Tinggi"


39. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


40. <EditText


41. android:id="@+id/edt_height"


42. android:layout_width="match_parent"


43. android:layout_height="wrap_content"


44. android:inputType="numberDecimal"


45. android:lines="1"


46. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


47. <Button


48. android:id="@+id/btn_calculate"


49. android:layout_width="match_parent"


50. android:layout_height="wrap_content"


51. android:text="Hitung"


52. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


53. <TextView


54. android:id="@+id/tv_result"


55. android:layout_width="match_parent"


56. android:layout_height="wrap_content"


57. android:text="Hasil"


58. android:gravity="center"


59. android:textSize="24sp"


60. android:textStyle="bold"


61. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


62. </LinearLayout>






Akan muncul warning pada attribut android:text pada layout tersebut. Ini disebabkan karena kita hardcode code string kita. Mari kita hilangkan code warning tersebut dengan menekan alt+enter pada attribut android:text. Akan muncul dialog seperti ini, pilihlah extract string resource.
Kemudian akan muncul dialog seperti dibawah ini, sesuaikan dengan nama yang ada.
Fungsi extract string resource akan secara otomatis menambahkan values dalam android:text ke dalam file res → values → strings.xml. Tambahkan juga pada view lainnya hingga tidak ada warning lagi. Jika kita buka files strings.xml akan seperti ini. 


1. <resources>


2. <string name="app_name">BarVolume</string>


3. <string name="lebar">Lebar</string>


4. <string name="tinggi">Tinggi</string>


5. <string name="hitung">Hitung</string>


6. <string name="hasil">Hasil</string>


7. <string name="panjang">panjang</string>


8. </resources>




Jika terjadi error pada attribut dimens, maka kita perlu menambahkan file dimens.xml di dalam res → values → dimens.xml. Error ini disebabkan karena pada Android Studio 2.3 file dimens.xml sudah tidak di generate secara otomatis ketika sebuah project dibuat. Langsung saja tambahkan dengan cara klik kanan pada directory res. Akan muncul dialog seperti ini.





Kemudian isikan sesuai di bawah ini.


Jika file dimens.xml sudah terbuat, sesuaikan isi dari dimens.xml menjadi seperti berikut. 


1. <resources>


2. <!-- Default screen margins, per the Android Design guidelines. -->


3. <dimen name="activity_horizontal_margin">16dp</dimen>


4. <dimen name="activity_vertical_margin">16dp</dimen>


5. </resources>






Menambahkan Kode Logika Sederhana pada MainActivity 
Selanjutnya setelah selesai, lanjutkan dengan membuka file MainActivity.java dan lanjutkan ngoding baris-baris dibawah ini.




1. public class MainActivity extends AppCompatActivity implements View.OnClickListener{


2. private EditText edtWidth, edtHeight, edtLength;


3. private Button btnCalculate;


4. private TextView tvResult;


5. 


6. @Override


7. protected void onCreate(Bundle savedInstanceState) {


8. super.onCreate(savedInstanceState);


9. setContentView(R.layout.activity_main);


10. edtWidth = (EditText)findViewById(R.id.edt_width);


11. edtHeight = (EditText)findViewById(R.id.edt_height);


12. edtLength = (EditText)findViewById(R.id.edt_length);


13. btnCalculate = (Button)findViewById(R.id.btn_calculate);


14. tvResult = (TextView)findViewById(R.id.tv_result);


15. btnCalculate.setOnClickListener(this);


16. }


17. 


18. @Override


19. public void onClick(View v) {


20. if (v.getId() == R.id.btn_calculate){


21. String length = edtLength.getText().toString().trim();


22. String width = edtWidth.getText().toString().trim();


23. String height = edtHeight.getText().toString().trim();


24. boolean isEmptyFields = false;


25. if (TextUtils.isEmpty(length)){


26. isEmptyFields = true;


27. edtLength.setError("Field ini tidak boleh kosong");


28. }


29. if (TextUtils.isEmpty(width)){


30. isEmptyFields = true;


31. edtWidth.setError("Field ini tidak boleh kosong");


32. }


33. if (TextUtils.isEmpty(height)){


34. isEmptyFields = true;


35. edtHeight.setError("Field ini tidak boleh kosong");


36. }


37. if (!isEmptyFields) {


38. double l = Double.parseDouble(length);


39. double w = Double.parseDouble(width);


40. double h = Double.parseDouble(height);


41. double volume = l * w * h;


42. tvResult.setText(String.valueOf(volume));


43. }


44. }


45. }


46. }


Jika terdapat baris merah seperti ini :




Jangan khawatir, silakan klik keatas baris merah tersebut dan silakan klik pada icon atau dengan tekan tombol (Alt + Enter)lalu pilih implements method






Setelah sudah selesai silakan jalankan aplikasi dengan mengklik atau Run → Run ‘app’ dari menu bar. Kemudian ada pilihan seperti ini.
Itu tandanya adb (Android Debugger) device yang anda punya telah terkoneksi dengan Android Studio. Jika anda tidak memiliki device silakan gunakan emulator. Ikuti materinya disini https://developer.android.com/studio/run/managing-avds.html.

Kami merekomendasikan anda menggunakan device Android sewaktu develop aplikasi di Android. Selain karena akan menghemat penggunaan memori dari device yang anda gunakan, juga akan memberikan pengalaman yang berbeda dengan menjalankan aplikasi di device anda sendiri. Pilih OK untuk menjalankan dan tunggu hingga proses building dan instalasi apk aplikasi anda berjalan. Jika sudah, seharusnya hasilnya akan seperti ini.
Silakan masukan nilai panjang, lebar dan tinggi kemudian tekan tombol Hasil dan whoilla hasilnya akan ditampilkan di obyek TextView tvHasil.
Selesai? Belum, masih ada yang kurang , ketika setelah menghitung luas dan kemudian terjadi pergantian orientasi pada device maka hasil perhitungan akan hilang. Tambahkan beberapa baris berikut pada MainActivity.java




1. private static final String STATE_HASIL = "state_hasil";


2. 


3. @Override


4. protected void onSaveInstanceState(Bundle outState) {


5. 


6. outState.putString(STATE_HASIL, tvResult.getText().toString());


7. super.onSaveInstanceState(outState);


8. }


Kemudian tambahkan juga beberapa baris berikut pada baris terakhir method onCreate




9. if (savedInstanceState != null){


10. String hasil = savedInstanceState.getString(STATE_HASIL);


11. tvResult.setText(hasil);


12. } 
Silakan jalankan aplikasi kembali kemudian coba lakukan perhitungan dan ganti orientasi device. Jika sudah benar maka hasil perhitungan akan dijaga. 


Bedah Kode


Pembahasan tentang layout xml


1. xml version="1.0" encoding="utf-8"?> => 


Baris ini mengidentifikasi bahwa file ini berformat xml.


1. xmlns:android="http://schemas.android.com/apk/res/android"


2. xmlns:tools="http://schemas.android.com/tools"


Merupakan namespace yang digunakan dalam keseluruhan file xml ini.


1. tools:context="com.dicoding.associate.barvolume.MainActivity" 


Mengidentifikasi bahwa file layout xml ini berelasi dengan MainActivity.






Disini kita menggunakan beberapa komponen user interface yang disebut View diantaranya:


TextView : Komponen View untuk menampilkan teks ke layar


EditText : Komponen View untuk memberikan input teks


Button : Komponen View untuk melakukan sebuah aksi dengan mengklik


LinearLayout : Komponen View bertipe ViewGroup yang menjadi parent dari semua sub komponen View (Sub View) didalamnya. Komponen ini bersifat sebagai kontainer untuk komponen lain dengan susunan secara Vertikal atau Horizontal.


Cara membaca :


1. <TextView


2. android:layout_width="match_parent"


3. android:layout_height="wrap_content"


4. android:text="Panjang"


5. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


Komponen diatas adalah sebuah TextView, warna ungu menandakan namespace yang digunakan, warna biru adalah atribut dari komponen dan warna hijau adalah nilai dari atribut. Penjelasannya seperti dibawah ini:











match_parent: Ini berarti bahwa ukuran dimensi sebuah View disesuaikan dengan ukuran layar secara horizontal jika pada layout_width dan vertikal jika pada layout_height.


wrap_content : Ini berarti bahwa ukuran dimensi sebuah View disesuaikan dengan ukuran konten didalamnya baik secara horizontal pada layout_width dan vertikal jika pada layout_height.


@dimen/activity_vertical_margin: Value activity_vertical_margin berasal dari file resource dimens.xml yang bisa anda lihat dengan cara menekan dan tahan tombol ctrl (atau command) + arahkan kursor keatasnya dan kemudian klik sekali. Penggunaan centralize resource value akan memudahkan anda sewaktu developmen aplikasi Android. Penggunaan cara tersebut supaya tidak menulis value yang sama berulang-ulang.




Apa itu ‘@+id/’ ? 

Salah satu contoh penerapan penggunaan @+id/ sebagai berikut:
1. <Button
2. android:id="@+id/btn_calculate"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:text="Hitung"
6. android:layout_marginBottom="@dimen/activity_vertical_margin"/>


Penjelasannya sebagai berikut:


1. android:id="@+id/btn_calculate"

Jika kita memberikan id pada sebuah View maka kita telah memberikan identifier untuk View tersebut agar:


Bisa kita manipulasi/dikontrol pada level logic di komponen seperti Activity atau Fragment. ID ini akan diciptakan di file R.javakedalam bentuk nilai hexa bertipe data Integer à public static final int btn_calculate=0x7f0b0057;



Sebagai acuan untuk penyusunan tampilan pada RelativeLayout (akan dibahas pada modul selanjutnya).

Pembahasan tentang Logika Kode


1. public class MainActivity extends AppCompatActivity 


Menandakan bahwa Kelas Java kita merupakan sebuah Activity karna inherit ke superclass bernama AppCompatActivity


1. implements View.OnClickListener 


Ini adalah listener yang kita implementasikan untuk melakukan proses event klik pada komponen tombol (button)

Jika terdapat baris merah seperti ini :

Jangan khawatir, silakan klik ke atas baris merah tersebut dan silakan klik pada icon atau dengan tekan tombol (Alt + Enter) lalu pilih implements method


1. private EditText edtWidth, edtHeight, edtLength;
2. private Button btnCalculate;
3. private TextView tvResult;


Deklarasi semua komponen View yang akan dimanipulasi. Kita deklarasikan secara global agar bisa dikenal di keseluruhan bagian kelas.

1. @Override
2. protected void onCreate(Bundle savedInstanceState) {
3. super.onCreate(savedInstanceState);
4. setContentView(R.layout.activity_main);
5. edtWidth = (EditText)findViewById(R.id.edt_width);
6. edtHeight = (EditText)findViewById(R.id.edt_height);
7. edtLength = (EditText)findViewById(R.id.edt_length);
8. btnCalculate = (Button)findViewById(R.id.btn_calculate);
9. tvResult = (TextView)findViewById(R.id.tv_result);
10. btnCalculate.setOnClickListener(this);
11. }

Method onCreate() merupakan method utama pada Activity. Di sinilah kita dapat mengatur layout xml dan semua proses inisialisasi komponen yang akan digunakan diciptakan. Pada method ini kita casting semua komponen View yang kita telah deklarasikan sebelumnya, agar dapat kita manipulasi.

1. setContentView(R.layout.activity_main);


Maksud baris diatas adalah bahwa kelas MainActivity akan menampilkan tampilan yang berasal dari layout activity_main.xml


1. edtWidth = (EditText)findViewById(R.id.edt_width);


Maksud dari baris diatas adalah obyek EditText edtWidth disesuaikan (Cast) dengan komponen EditText ber-ID edt_width di layout xml melalui method findViewById()

1. btnCalculate.setOnClickListener(this); 


Set Event Click Listener untuk obyek btnCalculate sehingga dapat melakukan sebuah aksi ketika pengguna melakukan Klik. Keyword this menekankan pada obyek Activity saat ini yang telah mengimplementasikan listener OnClickListener sebelumnya. 

Pembahasan saveInstanceState 

1. @Override
2. protected void onSaveInstanceState(Bundle outState) {
3. 
4. outState.putString(STATE_HASIL, tvResult.getText().toString());
5. super.onSaveInstanceState(outState);
6. }

Perhatikan pada method onSaveInstanceState, didalam method ini hasil perhitungan yang ditampilkan pada tvResult dimasukkan pada bundle kemudian di save isinya. Setelah onSaveInstanceState berhasil dijalankan maka activity akan melakukan proses onDestroy dan menjalankan lagi OnCreate secara otomatis.


1. if (savedInstanceState != null){


2. String hasil = savedInstanceState.getString(STATE_HASIL);


3. tvResult.setText(hasil);


4. }


Pada onCreate inilah kita menggunakan nilai bundle yang telah kita simpan tadi pada onSaveInstanceState kemudian kita isikan kembali pada tvResult.

Selamat! Anda telah berhasil membuat dan menjalankan aplikasi android pertama di device atau emulator. Silakan lanjut ke CodeLab berikutnya.




0 komentar:

Post a Comment

Popular Posts

Blog Archive

loading...