Dalam materi sebelumnya, selalu digunakan satu activity. Tentu saja sebuah applikasi sering
membutuhkan lebih dari satu activity. Activity adalah komponen penyusun Android App yang
berisi satu kegiatan yang dapat dilakukan oleh pengguna (terkait dengan user interface).
Activity Lifecycle
Berbeda dengan program pada komputer, app di mobile memiliki keterbatasan terutama
keterbatasan memori dan daya batere. Oleh karena itu activity tidak dapat hidup terus menerus
dalam memori. Gambar berikut memperlihatkan method yang di-trigger saat activity mulai
dijalankan.
Activit
Activi
ty
● onCreate: inisialisasi activity, berisi logic yang hanya dijalankan sekali dalam activity
lifecyle.
● onStart: inisialisasi user interface.
● onResume: inisialisasi komponen yang di-release saat pemanggilan onPause
Sebaliknya, gambar berikut memperlihatkan apa yang terjadi saat activity pindah ke
background atau selesai.
Activit pindah ke
background
Saat activity berubah dari pause menjadi stop, maka akan dipanggil onStop(). Pada method ini
dapat dilakukan komputasi yang kompleks untuk menyimpan state. Pada saat kondisi stop,
activity sama sekali tidak muncul di layar dan fokus sudah berada di app lain. Saat activity
selesai (finish dipanggil), atau orientasi layar berubah atau kehabisan memori, makan
onDestroy akan dipanggil.
Kita dapat menangani setiap fase dari activity. Penting bagi developer untuk menjaga “ilusi”
bahwa app aktif terus menerus, sehingga aktivitas user tidak terputus. Misalnya saat user
sedang melakukan aktivitas di sebuah app, user menerima telepon. Saat user selesai menerima
telepon dan membuka app kembali, user harus dapat melanjutkan aktivitasnya walaupun
misalnya app didestroy oleh sistem. Demikian juga untuk app yang menggunakan sensor,
koneksi dengan sensor perlu dilepaskan saat app di-pause atau distop untuk menghemat batere
dan dikembalikan saat activity aktif. Walaupun jika memori memungkinkan, Android akan
mempertahankan selama mungkin activity dalam memori.
Gambar berikut memperlihatkan event yang dipanggil saat acvtivity dalam kondisi destroyed,
stopped dan paused dan kembali aktif.
1
destro onCre onS onRes
ate tart ume
stop onRe
start
paus
Dapat dilihat untuk membuat app seolah-olah tidak terputus, yang harus dilakukan adalah
menyimpan state saat app dipause atau distop (onPause, onStop) kemudian mengembalikan
state tersebut saat activity ‘hidup’ pada event onResume dan onRestart. Berikut method yang
dapat di-override dari acvitiy. Tentu tidak perlu semua diimplementasikan, cukup bagian yang
diperlukan.
Sekarang kita akan membuat contoh app yang memiliki dua activity dan berkomunikasi melalui
intent.
Pertama buat project baru (blank activity). Kemudian langsung buat activity kedua. Pada bagian
project explorer, pilih package, lalu klik kanan new -> activity -> empty activity (gambar
bawah)
2
Android Studio akan membuat activity kedua seperti berikut
Pada activity_main2.xml (activity kedua) tambahan text dan tulisan “ini activity dua” sbb:
3
Sekarang kita akan menambahkan kode agar saat button ditekan di activity pertama, maka
activity kedua akan dijalankan.
Coba jalankan. Saat button ditap maka activity dua akan dijalankan. Saat back ditekan, maka
akan kembali ke activity pertama.
4
<activity android:name=".Main2Activity"
android:label = "Aktivity Kedua"
android:parentActivityName= ".MainActivity">
</activity>
Jika dijalankan maka akan muncul panah sebagai berikut yang jika ditap akan kembali ke activity
parent:
Kita akan mengubah project sebelumnya, sehingga saat button di tap ditekan ada data yang
dikirimkan dari Activity1 ke Activity2.
Pertama tambahkan konstanta untuk indentifikasi unik message. Intent dapat digunakan tidak
hanya di app yang sama, tapi juga antar app sehingga perlu identifikasi yang unik.
Ubah event onclik sebagai berikut, informasi dikirim denga method putExtra():
Sekarang, kita akan menangkap pesan ini pada activity2, pada Main2Activity.java tambahkan
kode berikut.
@Override
protected void onCreate(Bundle savedInstanceState) {
5
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//ambil intent
Intent intent2 = getIntent();
//ambil datanya
String pesan = intent2.getStringExtra(MainActivity.EXTRA_MESSAGE);
//tampilkan pesan sebagai toast
Toast t = Toast.makeText(getApplicationContext(), "Pesan:"+pesan,
Toast.LENGTH_LONG);
t.show();
}
Sekarang bagaimana kalau kita ingin mendapatkan data dari activity yang kita panggil?
Misalnya user mengisi form di activity 2, lalu setelah selesai akan kembali ke actvity pertama.
Untuk mengirimkan dan menerima data dari activity, dapat digunakan method
startActivityForResult. Kita akan memodifikasi project sebelumnya dengan membuat activity
yang memanggil activity lain, pengguna mengisi data pada activity tersebut dan
mengirimkannya kembali ke activity utama.
Catatan: jika anda mau program sebelumnya tidak hilang, anda dapat menduplikasi project
dengan mencopy-paste project tersebut pada package explorer.
Sedangkan untuk menerima hasil, codenya adalah sebagai berikut (di Activity pertama,
MainActivity.java). Method onActivityResult akan dipanggil (tertrigger) setelah user selesai
dengan activity kedua.
@Override
6
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
// cek request code
if (requestCode == ACT2_REQUEST) {
String pesan = data.getStringExtra(EXTRA_MESSAGE);
//tampilkan toast
Toast toast = Toast.makeText(getApplicationContext(), "Pesan:"+pesan,
Toast.LENGTH_LONG);
toast.show();
}
}
Sekarang kita ubah activity pertama agar menambahkan pesan dari activity kedua.
Tambahkan aksi button sebagai berikut, perhatikan penggunaan putExtra dan setResult:
Jalankan, maka setelah user mengklik tombol “selesai” pada activity 2, maka akan kembali ke
activity pertama dan pesan dari activity kedua akan ditampilkan.
Latihan 2:
Buat activity utama berisi nama, alamat, telp. Saat button “Edit” ditekan, maka data yang ada di
activity utama dikirim ke activity kedua, dan user diberi kesempatan untuk mengedit data tersebut.
7
Setelah button simpan ditekan maka layar akan kembali ke activity utama dan data di activity utama
harus terupdate (gambar bawah)
@Override
protected void onCreate(Bundle savedInstanceState) {
...
}
savedInstanceState adalah objek yang menyimpan state activity seperti isi widget sehingga saat
app masuk ke pause/stop dan kemudian kembali, widget terisi kembali secara otomatis. Ingat
bahwa jika device dirotate maka activity akan didestroy dan dicreate kembali. Kita dapat
memanfaatkan Bundle ini untuk menyimpan variabel-variabel yang perlu dikembalikan state-
nya pada saat activity aktif dari kondisi stop atau destroyed.
Contoh berikut akan lebih menjelaskan masalah ini. Pertama buatlah app dengan dua button
dan satu textview. Saat button “simpan” diklik maka variabel nama dan skor akan terisi.
Sedangkan saat tombol “tampil” diklik maka isi variabel akan dicetak di TextView.
8
Implementasi dua button di MainActivity adalah sebagai berikut (jangan lupa link properti
onClick tiap button).
String nama;
int skor;
Coba jalankan program. Tap simpan lalu tap tampil, maka hasilnya akan seperti ini:
Sekarang coba rotate screen, pastikan setting autorotate on (atau ctrl-F11 di emulator). Proses
rotate akan men-destroy activity dan meng-create ulang. Sekarang coba klik tampil (jangan klik
simpan), efeknya akan seperti ini:
Terlihat bahwa variabel yang dimiliki Activity akan hilang saat di-destroy. Tentu saja pengguna
akan berasumsi proses rotate tidak akan merubah state dari activity. Ini juga berlaku misalnya
saat pengguna pindah ke activity lain dan kemudian kembali ke activity semula, mereka akan
berharap kondisi activity akan sama seperti sebelum ditinggalkan walaupun sebenarnya di
belakang layar activity di-destroy.
Untuk mengatasi ini, kita perlu meng-override dua method di MainActivity, pertama
9
onSaveInstanceState untuk menyimpan state dan kedua adalah onRestoreInstanceState untuk
mengembalikan state. Contoh kodenya adalah sebagai berikut:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
//simpan variabel
//method ini dipanggil sebelum onStop
savedInstanceState.putInt("state_skor", skor);
savedInstanceState.putString("state_nama", nama);
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Restore nilai
skor = savedInstanceState.getInt("state_skor");
nama = savedInstanceState.getString("state_nama");
}
Jalankan dan perhatikan efeknya (simpan → tampil → rotate (ctrl-F11) → tampil). Maka
variabel akan tetap tersimpan. Karena sebelum distop variabel disimpan di savedInstanceState
dan saat diaktifkan akan direstore.
todo
Implicit intents allow you to activate an activity if you know the action, but not the
specific app or activity that will handle that
action. For example, if you want your app to take a photo, or send email, or display a
location on a map, you typically do
not care which specific app or activity actually performs these actions.
Conversely, your activities can declare one or more intent filters in the Android manifest
that advertise that activity's ability
to accept implicit intents and to define the particular type of intents it will accept.
To match your request with a specific app installed on the device, the Android system
matches your implicit intent with an
activity whose intent filters indicate that they can perform that action. If there are
multiple apps installed that match, the user
is presented with an app chooser that lets them select which app they want to use to
handle that intent
10
Catatan: pastikan di depan URL harus ditambahkan http:\\
11