Anda di halaman 1dari 12

Activity dan Intent

Yudi Wibisono yudi@upi.edu


Lisensi dokumen ini creative common
Slide: https://docs.google.com/presentation/d/1gm7xWAjtZM-
Dtgvrv6dLdh67lNxrhTWaR0u56O6wty8/edit?usp=sharing

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

onC onSt onRes


art ume

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

onP onSt onDes


op troy
Activit
y
activity selesai, ganti
tidak orientasi atau
Saat activity di-pause, maka akan dipanggil onPause(). Ini artinya activity masih terlihat
walaupun cuma sebagian. Isi dari onPause tidak boleh terlalu berat, seperti menulis ke
database karena akan memperlambat proses transisi ke activity lain. Umumnya onPause
digunakan untuk tiga hal: menstop animasi, musik atau aktivitas yang menggunakan banyak
CPU; commit input dari user (misalnya draft email); melepaskan system resources seperti
sensor atau kamera.

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.

public class Activity extends ApplicationContext {


protected void onCreate(..);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}

Membuat multi activity


Untuk menghubungkan antar activity dapat digunakan intent. Intent adalah mekanisme untuk
menghubungkan antar satu activity dengan activity yang lain, baik untuk activity di dalam app
yang sama maupun antar app yang berbeda. Intent juga digunakan untuk notifikasi event
misalnya saat SD card dimasukkan, SMS masuk dan lain-lain.

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

Layout juga otomatis dibuatkan (gambar bawah):

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.

Pada MainActivity.java (activity pertama), tambahkan aksi saat button ditap:

public void klikButton(View v) {


Intent intent2 = new Intent(this, Main2Activity.class);
startActivity(intent2);
}

Tambahkan button di acvitiy pertama (activity_main.xml) :

Jangan lupa set onClick.

Coba jalankan. Saat button ditap maka activity dua akan dijalankan. Saat back ditekan, maka
akan kembali ke activity pertama.

Buka manifest, edit activity kedua sebagai berikut

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:

Menambahkan Informasi pada Intent

Bagaimana jika kita ingin mengirimkan pesan ke activity lain?

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.

public class MainActivity extends AppCompatActivity {


...
//konstanta, supaya bisa membedakan antar message
public final static String EXTRA_MESSAGE =
"edu.upi.cs.yudiwbs.app1.MESSAGE";
...
}

Ubah event onclik sebagai berikut, informasi dikirim denga method putExtra():

public void klikButton(View v) {


Intent intent2 = new Intent(this, Main2Activity.class);
intent2.putExtra(EXTRA_MESSAGE, "Ini pesan dari acvtivity 1");
startActivity(intent2);
}

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();
}

Jalankan program dan akan muncul pesan kiriman activity1 di activity2

Menerima Data dari Activity yang dipanggil

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.

Bagian untuk memanggil activity kedua diubah sbb, perhatikan penggunaan


startActivityForResult:

public class MainActivity extends AppCompatActivity {


...
static final int ACT2_REQUEST = 99; // request code
...
}

public void klikButton(View v) {


Intent intent2 = new Intent(this, Main2Activity.class);
// perhatikan penggunaan startactvity for result
startActivityForResult(intent2,ACT2_REQUEST);
}

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:

public void klikButton(View v) {


Intent intent2 = getIntent();
intent2.putExtra(MainActivity.EXTRA_MESSAGE, "Ini pesan dari
acvtivity 2 (DUA)");
//bungkus string balasan
setResult(RESULT_OK,intent2);
//close acvitituy dua
finish();
}

Tambahkan button di di Activity 2 (activity_main2.xml) sebagai berikut, jangan lupa set


onCliknya dengan klikButton.

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)

Simpan dan Load Activity State


Coba lihat project yang pernah anda buat sebelumnya, dalam setiap project, di method
onCreate dapat dilihat parameter bertipe Bundle.

@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;

public void klikButtonSimpan(View v) {


skor = 100;
nama = "budi martami";
}

public void klikButtonTampil(View v) {


TextView tv = (TextView) findViewById(R.id.textView);
tv.setText("skor:"+skor+" nama: "+nama);
}

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);

//jangan lupa panggil parent


super.onSaveInstanceState(savedInstanceState);
}

@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.

Mememulai Acvitiy dengan Implicit Intents

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:\\

public void openWebsite(View view) {


// Get the URL text.
String url = mWebsiteEditText.getText().toString();
// Parse the URI and create the intent.
Uri webpage = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
// Find an activity to hand the intent and start that activity.
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Log.d("ImplicitIntents", "Can't handle this intent!");
}

11

Anda mungkin juga menyukai