Navigasi Layar &
Sistem
Intent 🚀
Aplikasi yang bagus tidak berhenti di satu halaman. Pelajari cara menggunakan "Surat Perintah" Android untuk memindahkan user dari form login ke halaman dashboard sambil membawa data rahasia!
Dua Wajah Intent
Intent adalah pesan asinkron yang mengizinkan aplikasi meminta aksi dari komponen lain. Intent dibagi menjadi dua jalur utama:
Intent Explicit (Internal)
Digunakan untuk melompat antar layar di dalam aplikasi kita sendiri. Kita memanggil nama file Activity-nya secara langsung dan terang-terangan.
Intent Implicit (Eksternal)
Digunakan untuk mendelegasikan tugas ke Aplikasi Lain (Buka Web, Telepon, Kamera). Kita tidak tahu nama Activity-nya, kita hanya berteriak minta tolong!
putExtra()
Selain memindahkan user, Intent
punya "bagasi". Kamu bisa menyimpan data di layar 1 (misal: String nama), lalu
membongkarnya di layar 2 menggunakan getStringExtra().
finish() & Flags
Panggil finish() jika
ingin menutup layar saat ini secara manual. Gunakan
FLAG_ACTIVITY_CLEAR_TOP jika ingin membuang tumpukan Activity di atas
layar tujuanmu.
Level Up: Bundle & Parcelable
Saat datamu mulai banyak (misal: mengirim nama, umur, hobi, dan foto sekaligus), menggunakan
putExtra() satu-satu sangat tidak efisien. Inilah fungsi dari Bundle dan
Parcelable!
1. Bundle (Tas Ransel)
Kumpulkan semua datamu ke dalam satu tas "Bundle", lalu berikan tas tersebut ke Intent.
// --- PENGIRIM ---
Bundle tas = new Bundle();
tas.putString("NAMA", "John");
tas.putInt("UMUR", 20);
Intent intent = new Intent(this, Tujuan.class);
intent.putExtras(tas); // Serahkan tas
// --- PENERIMA ---
Bundle tasMasuk = getIntent().getExtras();
String nama = tasMasuk.getString("NAMA");
2. Parcelable (Vakum Data)
Punya Custom Object Java utuh (misal class Mahasiswa)? Objek harus divakum/di-serialize menggunakan Parcelable agar muat dikirim.
// Buat class Mahasiswa.java
public class Mahasiswa implements Parcelable {
String nama;
String nim;
// ... (Kode Auto-Generate Android Studio)
}
// Cara Kirim Object:
Mahasiswa mhs = new Mahasiswa("Ali", "123");
intent.putExtra("DATA", mhs);
Latihan 1: Login & Buka Web
Halo! 👋
Ini adalah MainActivity.
-- Intent Explicit --
-- Intent Implicit --
Data dari PutExtra:
Halo, Anonymous!
Kamu sekarang berada di ProfilActivity. Kita pindah ke sini
menggunakan Intent Explicit.
Ini adalah struktur kode lengkapnya. Pastikan ID komponen di file XML cocok persis
dengan panggilan findViewById di file Java!
<!-- activity_main.xml (Layar Pertama) -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Layar Login"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginBottom="32dp"/>
<EditText
android:id="@+id/inputNama"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Masukkan Nama Kamu"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/btnPindah"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="BUKA PROFIL (EXPLICIT)"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/btnBukaWeb"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="BUKA WEB (IMPLICIT)" />
</LinearLayout>
Latihan 2: Peta, Kamera & Layar Catatan
Jejak Petualang App
Buku Catatan
Hari ini aku pergi ke Monas. Cuacanya sangat cerah dan aku mengambil banyak foto pemandangan di sekitar bundaran HI...
Ayo kita gabungkan Implicit Intent untuk membuka Maps dan Kamera, serta Explicit Intent untuk pindah ke layar CatatanActivity di dalam aplikasi kita sendiri!
<!-- activity_petualang.xml -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Jejak Petualang App"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginBottom="32dp"/>
<Button
android:id="@+id/btnPeta"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="BUKA GOOGLE MAPS"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/btnKamera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="AMBIL FOTO (KAMERA)"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/btnDetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="LIHAT CATATAN (EXPLICIT)" />
</LinearLayout>
Latihan 3: Parcelable (Kirim Object)
Pendaftaran User
Kartu Anggota
Nama
-
Umur
-
-
Biar nggak capek putExtra satu-satu, kita bungkus ketiganya ke dalam Class
User.java yang meng-implements Parcelable. Setelah itu, kita
tinggal kirim object User-nya secara utuh!
<!-- activity_main.xml -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp">
<EditText
android:id="@+id/etNama"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Nama Lengkap" />
<EditText
android:id="@+id/etUmur"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:hint="Umur" />
<EditText
android:id="@+id/etEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:hint="Email"
android:layout_marginBottom="16dp"/>
<Button
android:id="@+id/btnKirim"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="KIRIM DATA (PARCELABLE)" />
</LinearLayout>
8. Mini Challenge Terpadu
Mari kita gabungkan semua ilmu hari ini! Buatlah Aplikasi ID Card Generator yang terdiri dari dua halaman!
- Layar 1 (`FormActivity`): Buat 3 kolom `EditText` (Nama, Umur, Hobi).
- Buat 1
ImageView(sebagai wadah foto) dan 1 Tombol "AMBIL FOTO". Tombol ini akan menembakkan Kamera Implicit menggunakan metodestartActivityForResult(). - Setelah foto diambil, pasang hasilnya di
ImageViewdan simpan ke variabel global Bitmap. - Buat 1 Tombol "CETAK ID CARD". Tombol ini akan berpindah ke Layar 2, sekaligus mengirim
teks dan Foto Bitmap tadi via
putExtra(). - Layar 2 (`DetailActivity`): Tangkap teks dan foto tersebut, lalu atur agar
desainnya menyerupai Kartu Identitas! Tambahkan 1 Tombol Selesai yang memanggil
finish().
Kunci Jawaban Pengiriman Data & Foto (Java):
// ====== Di FormActivity.java (Layar 1) ======
public class FormActivity extends AppCompatActivity {
private static final int KODE_KAMERA = 100;
private Bitmap fotoProfil = null;
private ImageView imgPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_form);
EditText inputNama = findViewById(R.id.inputNama);
EditText inputUmur = findViewById(R.id.inputUmur);
EditText inputHobi = findViewById(R.id.inputHobi);
Button btnFoto = findViewById(R.id.btnFoto);
Button btnKirim = findViewById(R.id.btnKirim);
imgPreview = findViewById(R.id.imgPreview);
// Aksi Tombol Kamera
btnFoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intentKamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intentKamera, KODE_KAMERA);
}
});
// Aksi Tombol Kirim Data
btnKirim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String nama = inputNama.getText().toString();
String umur = inputUmur.getText().toString();
String hobi = inputHobi.getText().toString();
Intent intent = new Intent(FormActivity.this, DetailActivity.class);
intent.putExtra("DATA_NAMA", nama);
intent.putExtra("DATA_UMUR", umur);
intent.putExtra("DATA_HOBI", hobi);
// Titipkan juga foto kalau sudah menjepret
if (fotoProfil != null) {
intent.putExtra("DATA_FOTO", fotoProfil);
}
startActivity(intent);
}
});
}
// Tangkap kembalian dari Kamera
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == KODE_KAMERA && resultCode == RESULT_OK) {
// Ambil thumbnail Bitmap
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
imgPreview.setImageBitmap(thumbnail);
fotoProfil = thumbnail; // Simpan ke global
}
}
}
// ====== Di DetailActivity.java (Layar 2) ======
public class DetailActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
TextView textNama = findViewById(R.id.textNama);
TextView textUmur = findViewById(R.id.textUmur);
TextView textHobi = findViewById(R.id.textHobi);
ImageView imgHasilFoto = findViewById(R.id.imgHasilFoto);
Button btnBack = findViewById(R.id.btnBack);
// Tangkap Teks
Intent intent = getIntent();
textNama.setText("Nama: " + intent.getStringExtra("DATA_NAMA"));
textUmur.setText("Umur: " + intent.getStringExtra("DATA_UMUR") + " Tahun");
textHobi.setText("Hobi: " + intent.getStringExtra("DATA_HOBI"));
// Tangkap Foto Bitmap
Bitmap fotoMasuk = intent.getParcelableExtra("DATA_FOTO");
if (fotoMasuk != null) {
imgHasilFoto.setImageBitmap(fotoMasuk);
}
// Tombol Selesai
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
Peringatan CRASH: AndroidManifest.xml
Kesalahan #1 Developer Pemula: Membuat class Activity baru di Java, menulis kode Intent
dengan benar, klik Run, lalu aplikasinya FORCE CLOSE saat tombol pindah layar dipencet!
Kenapa? Karena activity baru tersebut belum didaftarkan sebagai "warga resmi" di
AndroidManifest.xml!
<application ... >
<!-- Ini otomatis terbuat saat project dibikin -->
<activity android:name=".MainActivity">
<intent-filter> ... </intent-filter>
</activity>
<!-- KAMU WAJIB MENAMBAHKAN BARIS INI MANUAL (Di dalam tag <application>)! -->
<activity android:name=".ProfilActivity" />
<activity android:name=".CatatanActivity" />
</application>