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, atau Bitmap Foto), lalu membongkarnya di layar 2 menggunakan getIntent().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.
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 Gedung Sate. Cuacanya sangat cerah dan aku mengambil banyak foto pemandangan di sekitar Lapangan Gasibu...
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>
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>