Klik
Klik
Activity
• Last In, First Out (LIFO)
• Ingat, proses aktifitas android yang sedang tidak
bekerja, akan ditumpuk kedalam tumpukan,
sehingga aktifitas terakhir yang masuk, aktifitas
tersebut yang pertama akan dikeluarkan.
Activity
• Saving Activity State
• Aktivitas yang berada dalam state onPause, maka objek didalam
Aktivitas akan selalu tersimpan di dalam memory, sehingga
kondisinya akan tetap sama seperti kondisi sebelumnya.
• Akan tetapi, ketika terdapat kondisi Sistem Android memerlukan
memori, Objek dari Aktifitas akan dihancurkan, sehingga
lifecycle akan aktifitas akan dimulai kembali dari onCreate.
• Hal ini juga berlaku ketika anda mengubah orientasi dari layar
anda (portraint atau landscape) atau perubahan bahasa,
dikarenakan sistem harus menghancurkan aktifitas lama dan
membentuk aktifitas baru untuk menyesuaikan diri dengan
kondisi pengaturan baru sistem.
Activity
• Oleh karena itu, sebelum aktifitas dihancurkan, pastikan
anda selalu menyimpan perubahan yang terjadi
menggunakan metode onSaveInstanceState()
• onSaveInstanceState() dapat menyimpan informasi
dengan cara penyimpanana data menggunakan Bundle,
yang dapat menyimpan data yang tidak telalu besar
ukurannya
• Bagaimana jika datanya terlalu besar?
onSaveInstanceState
Buat Projek baru dengan Langkah-langkah:
1. Mulai Android Studio dan buat proyek Android Studio
baru. Beri nama projek “MyStatus”
2. Jangan lupa untuk mencentang “Include Kotlin
support”
3. Pilih SDK Minimum yang Anda gunakan di proyek
sebelumnya.
4. Pilih Empty Activity untuk template proyek. Klik
Next.
5. Terima nama aktivitas default (MainActivity). Pastikan
kotak Generate Layout file dicentang. Klik Finish.
onSaveInstanceState
Buat tampilan XML berikut pada activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/Status"
android:layout_width="match_parent"
android:layout_height="90dp"
android:layout_margin="10dp"
android:background="#aaa"
android:text="Status"/>
<TextView
android:id="@+id/textCount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Update Status"
android:layout_margin="5dp"/>
<EditText
android:id="@+id/newStatus"
android:layout_width="match_parent"
android:layout_height="90dp"
android:layout_margin="10dp"
android:gravity="top"
/>
<Button
android:id="@+id/submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update"
android:layout_margin="5dp"
android:layout_gravity="right"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
onSaveInstanceState
Pada MainActivity.kt, ketikan baris koding ini:
class MainActivity : AppCompatActivity() {
val MAX_LEN = 160
fun EditText.limitLength(maxLength: Int) {
filters = arrayOf(InputFilter.LengthFilter(maxLength))
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
newStatus.limitLength(MAX_LEN)
submit.setOnClickListener {
Status.text = newStatus.text
newStatus.text=null
}
newStatus.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable) {}
override fun beforeTextChanged(s: CharSequence, start: Int,
count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence, start: Int,
before: Int, count: Int) {
textCount.text = "Update Status :
${newStatus.length()} / ${MAX_LEN}"
}
})
}
}
onSaveInstanceState
• Pada koding ini, status yang telah diperbaharui, akan
tetap hilang pada saat pengguna mengubah orientasi
dari aplikasi
• Oleh karena itu, tambahkan koding berikut pada
MainActivity.kt
//tambahkan dibawah import
const private val EXTRA_STATUS= "STATUS_STATE“
//tambahkan didalam class MainActivity
override fun onSaveInstanceState(outState: Bundle?) {
if(outState!=null) {
outState.putString(EXTRA_STATUS, Status.text.toString())
}
super.onSaveInstanceState(outState)
}
onSaveInstanceState
• Pada akhir dari metode onCreate, tambahkan Koding
berikut
if(savedInstanceState!=null){
Status.text=savedInstanceState.getString(EXTRA_STATUS)
}
if(savedInstanceState!=null){
Status.text=savedInstanceState.getString(EXTRA_STATUS)
}
• Read more :
• https://developer.android.com/guide/components/intents-filters
Intent
• Pada contoh ini, anda akan mempelajari cara
1. Berpindah Aktifitas
2. Berpindah Aktifitas dengan membawa data
3. Berpindah Aktifitas dengan membawa objek
4. Menjalankan Intent Implicit
5. Mengembalikan nilai meggunakan fungsi finish
Intent
1. Berpindah Aktifitas
• Kondisikan
main_activity.xml
sebagai berikut
Intent
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/startActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Start Activity"/>
<TextView
android:id="@+id/textResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/startActivity"
android:layout_centerInParent="true"
android:layout_margin="10dp"
android:textSize="20dp"
android:text="Hasil"/>
</RelativeLayout>
Intent
1. Berpindah Aktifitas
• Buat Empty Activity
baru dan beri nama
Kondisikan
SecondActivity
• Kondisikan
activity_second.xml
sebagai berikut
Intent
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/label1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Second Activity"
android:textSize="30dp"
android:layout_margin="20dp"/>
</RelativeLayout>
Intent
• Pada onCreate, tambahkan metode berikut:
startActivity.setOnClickListener { openMyActivity() }
}
intent.putExtra(EXTRA_NAMA,"Sunaryo")
intent.putExtra(EXTRA_UMUR,27)
Intent
• Pembahasan Koding
• Key yang digunakan harus bersifat public dan
bernilai konstans.
• Pendeklarasian Key selalu dilakukan diatas
program, sebelum memasuki kelas.
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Person(val nama: String,
val umur: Int,
val email: String) : Parcelable
Intent
3. Berpindah Aktifitas dengan Membawa Objek
• Gantikan fungsi pada openMyActivity kelas
MainActivity.kt anda dengan:
var p = intent.getParcelableExtra<Person>(EXTRA_PERSON)
label1.text = "Nama : ${p.nama} berumur ${p.umur} " +
"alamat surel ${p.email}"
}
}
Intent
• Pembahasan Koding
• Pada saat anda membentuk objek dari kelas
Person, anda telah membuat sebuah kelas yang
bersifat Parcelable.
• Kelas yang bersifat Parcelable dapat dikirimkan
melalui pengiriman data Extra
var p = Person("Sunaryo",27,"Sunaryo@gmail.com")
intent.putExtra(EXTRA_PERSON,p);
Intent
• Pembahasan Koding
• Untuk pengambilan data parcelable, anda dapat
meggunakan fungsi dari intent, yaitu
getParcelableExtra
• Fungsi ini akan mengembalikan objek yang telah di
parcelable sebelumnya, menjadi objek yang pada
contoh ini adalah objek person
var p = intent.getParcelableExtra<Person>(EXTRA_PERSON)
Intent
4. Menjalankan Intent Implicit
• Menjalankan Internt ini, sama seperti pada Intent
Implicit pada semester sebelumnya, yaitu anda
harus mengetahui nama Intent yang digunakan
untuk menjalankan aplikasi yang telah tersedia
didalam Sistem Android
• Salah satu contoh yang dapat anda gunakan adalah
menggunakan implicit Mengirim SMS
Intent
4. Menjalankan Intent Implicit
• Gantikan fungsi pada openMyActivity kelas
MainActivity.kt anda dengan:
startActivity.setOnClickListener { openMyActivity() }
}
Intent
5. Mengembalikan nilai meggunakan fungsi finish
• Ubah kelas SecondActivity.kt anda dengan:
const val EXTRA_TEXT_RESULT= "EXTRA_TEXT"
const val EXTRA_CANCEL= -1000
const val EXTRA_RESULT= 92
finishBtn.setOnClickListener { sendResult() }
}
Intent
5. Mengembalikan nilai meggunakan fungsi finish
• Ubah kelas SecondActivity.kt anda dengan:
private fun sendResult() {
var IntentRes = Intent()
var myText = txtbox1.text.toString();
if(myText.isEmpty())
setResult(EXTRA_CANCEL)
else {
IntentRes.putExtra(EXTRA_TEXT_RESULT, myText)
setResult(EXTRA_RESULT, IntentRes)
}
finish()
}
}
Intent
5. Mengembalikan nilai meggunakan fungsi finish
• Ubah fungsi pada onActivityResult kelas
MainActivity.kt anda dengan:
override fun onActivityResult(requestCode: Int,
resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(REQUEST_CODE==requestCode) {
if (resultCode == EXTRA_RESULT) {
if (data != null) {
textResult.text =
data.getStringExtra(EXTRA_TEXT_RESULT)
}
}
else if(resultCode == EXTRA_CANCEL) {
textResult.text = "Data Kosong"
}
}
}
Intent
• Pembahasan Koding
• Untuk menerima hasil dari aktifitas kedua, anda harus
memulai aktifitas kedua menggunakan perintah
startActivityForResult() yang membutuhkan dua parameter,
yaitu intent Aktifitas ke dua dan sebuah REQUEST_CODE
• Nilai REQUEST_CODE dibebaskan untuk diberikan, sesuai
dengan kebutuhan aplikasi
• Apa fungsi REQUEST_CODE ini?
startActivityForResult(intent, REQUEST_CODE)
Intent
• Pembahasan Koding
• Hasil pengembalian data dari aktifitas kedua, diperoleh
dengan mengoverride sebuah metode onActivityResult()
yang terdiri dari tiga parameter, yaitu
1. requestCode yang dikirim saat startActivityForResult()
2. resultCode yaitu kode yang dikirimkan oleh aktivitas
kedua melalui perintah setResult()
3. Data yaitu data yang dikirimkan dari aktifitas kedua
override fun onActivityResult(requestCode: Int,
resultCode: Int, data: Intent?) {
Intent
• Pembahasan Koding
• Anda memerlukan sebuah objek Intent kosong tanpa
parameter
• Sebelum perintah finish() anda dapat mengirimkan
beberapa resultCode melalui fungsi setResult() yang akan
ditangkap pada fungsi onActivityResult()
var IntentRes = Intent()
var myText = txtbox1.text.toString();
if(myText.isEmpty())
setResult(EXTRA_CANCEL)
else {
IntentRes.putExtra(EXTRA_TEXT_RESULT, myText)
setResult(EXTRA_RESULT, IntentRes)
}
finish()
Intent
• Pembahasan Koding
• Pengiriman data hasil dilakukan melalui objek intent dengan
mengirimkan paket data Extra yang akan ditangkap oleh
parameter data pada onActivityResult()
Aktivitas Utama
Latihan 3
Buat kelas intent implicit untuk (pilih 3 dari 8)
• Membuat Telepon
• Mengirim Email (Phone Email)
• Mengirim Email (Gmail)
• Membuka sebuah Website
• Membuka Google Play Store
• Membuka Google Maps
• Mengambil Foto Capture Photo
• Berbagi Kontent
Apakah anda tau fungsi Shortcut
pada Android Studio?
• Pencarian :
• Ctrl + F : Pencarian teks dalam sebuah file
• Ctrl + Shift + F : Pencarian teks di seluruh projek
• Ctrl + R : mengganti teks di dalam file
Apakah anda tau fungsi Shortcut
pada Android Studio?
• Navigasi
• Ctrl + N : navigasi ke kelas
• Ctrl + Shift + N : navigasi ke file
• Ctrl + B : navigasi ke file dari teks yang terpilih
• Alt + ↑ : navigasi ke metode sebelumnya
• Alt + ↓ : navigasi ke metode sesudahnya
• Ctrl + G : lompat ke baris tertentu
• Ctrl + E : Navigasi file yang baru dibuka
• Ctrl + Klik Kanan / Ctrl + Alt + F7 : Navigasi ke variable/objek yang di klik
• Alt + F7 / Ctrl + F7 : Navigasi ke semua variable / objek yang dipilih
• Ctrl + Shift + B : Menavigasi ke implementasi dari variable / objek yang
dipilih
Apakah anda tau fungsi Shortcut
pada Android Studio?
• Koding
• Ctrl + D : mengandakan bagian yang terpilih
• Ctrl + Q : melihat dokumentasi objek jika ada
• Ctrl + P : melihat isi parameter dari sebuah metode
• Ctrl + Space : Memberikan Saran untuk melengkapi
koding
• Ctrl + Shift + Space : Memberikan Saran yang lebih
lengkap untuk melengkapi koding
• Alt + Insert : Menghasilkan code, terutama saat
membentuk konstraktor dan getter atau setter
• Ctrl + Alt + L : merapikan kode
Apakah anda tau fungsi Shortcut
pada Android Studio?
• Menjalankan Program
• Ctrl + F9 : build Project
• Ctrl + Shift + F9 : kompilasi berkas dan package
• Shift + F10 : Run
• Shift + F9 : Debug