Codelab ini menitikberatkan pada implementasi intent untuk melakukan perpindahan dari activity ke activity lain, dengan atau tidak membawa data. Beberapa bagian dari codelab ini akan menjawab beberapa pertanyaan umum dalam pengembangan aplikasi Android sebagai berikut:
- Bagaimana berpindah dari satu activity ke activity lain?
- Bagaimana berpindah dari satu activity ke activity lain dengan membawa data?
- Single value dari suatu variabel.
- Obyek model Plain Old Java Object (POJO).
- Menjalankan komponen di aplikasi lain untuk keperluan membuka browser atau melakukan pemanggilan melalui aplikasi telepon bawaan?
- Mengirimkan hasil nilai balik melalui Intent.
Codelab selanjutnya adalah dengan membuat aplikasi yang dapat menerapakan kegunaan intent. Seperti ini tampilannya.
Logika Dasar
Berpindah dari satu Activity ke Activity lain dengan membawa data. Activity asal akan mengirimkan data melalui Intent dan Activity tujuan akan menerima data yang dikirimkan.
Codelab Intent Sederhana
- Buat Project baru di Android Studio dengan kriteria sebagai berikut:
Nama Project MyIntentApp Target & Minimum Target SDK Phone and Tablet, Api level 21 Tipe Activity Empty Activity Activity Name MainActivity Use AndroidX artifacts True Language Java / Kotlin - Selanjutnya kita akan membangun antarmuka (interface) seperti ini:
- Kondisikan activity_main.xml menjadi seperti ini :
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="16dp">
- <Button
- android:id="@+id/btn_move_activity"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="16dp"
- android:text="@string/move_activity" />
- </LinearLayout>
Tambahkan juga resource string-nya. Tambahkan semua string yang akan digunakan di project ini. Buka berkas strings.xml dan tambahkan kode berikut ini.
- <resources>
- <string name="app_name">MyIntentApp</string>
- <string name="move_activity">Pindah Activity</string>
- <string name="move_with_data">Pindah Activity dengan Data</string>
- <string name="dial_number">Dial a Number</string>
- <string name="data_received">Data Diterima</string>
- <string name="this_is_moveactivity">Ini MoveActivity</string>
- </resources>
Kemudian masuk ke MainActivity, tambahkan beberapa baris kode yang berfungsi untuk meperkenalkan button yang sudah ditambahkan di layout seperti ini:
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button btnMoveActivity = findViewById(R.id.btn_move_activity);
- }
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- val btnMoveActivity: Button = findViewById(R.id.btn_move_activity)
- }
Lalu tambahkan beberapa baris yang berfungsi untuk menambahkan event onClick pada button btnMoveActivity seperti ini.
- public class MainActivity extends AppCompatActivity implements View.OnClickListener {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button btnMoveActivity = findViewById(R.id.btn_move_activity);
- btnMoveActivity.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_move_activity:
- break;
- }
- }
- }
- class MainActivity : AppCompatActivity(), View.OnClickListener {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- val btnMoveActivity: Button = findViewById(R.id.btn_move_activity)
- btnMoveActivity.setOnClickListener(this)
- }
- override fun onClick(v: View) {
- when (v.id) {
- R.id.btn_move_activity -> {
- }
- }
- }
- }
Button btnMoveActivity akan memiliki fungsi untuk berpindah Activity ke Activity lain. Sekarang kita buat Activity baru dengan cara sebagai berikut: Klik kanan di package utama aplikasi package name → New → Activity → Empty Activity.
- Lalu isikan MoveActivity pada dialog. Ketika sudah klik Finish.
- Untuk menandakan bahwa perpindahan activity berhasil, silakan tambahkan satu TextView dan kondisikan activity_move.xml menjadi seperti berikut.
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="16dp">
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/this_is_moveactivity" />
- </RelativeLayout>
Setelah Activity tujuan sudah berhasil diciptakan, sekarang saatnya menambahkan suatu Intent pada method onClick() di MainActivity.java menjadi sebagai berikut.
- @Override
- public void onClick(View v) {
- switch (v.getId()){
- case R.id.btn_move_activity:
- Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
- startActivity(moveIntent);
- break;
- }
- }
- override fun onClick(v: View) {
- when (v.id) {
- R.id.btn_move_activity -> {
- val moveIntent = Intent(this@MainActivity, MoveActivity::class.java)
- startActivity(moveIntent)
- }
- }
}
Selesai! Langkah pertama untuk memindahkan satu Activity ke Activity lain sudah selesai, sekarang silakan jalankan aplikasi Anda dengan mengklik tombol pada menu bar. Seharusnya sekarang anda sudah bisa memindahkan Activity dengan mengklik tombol ‘Pindah Activity’.
Bedah Kode
Register Activity
Kita telah belajar bagaimana membuat suatu activity baru. Di materi sebelumnya, syarat suatu activity haruslah terdaftar pada berkas AndroidManifest.xml. Karena menggunakan Android Studio, proses pendaftaran tersebut dilakukan secara otomatis.
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.dicoding.picodiploma.myintentapp">
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name=".MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".MoveActivity" />
- </application>
- </manifest>
Perhatikan bahwa MoveActivity sudah teregistrasi di AndroidManifest.xml. Sekarang sudah aman jika kita melakukan perpindahan activity dari MainActivity ke MoveActivity.
Jika kita lupa meregistrasikan Activity baru ke dalam berkas AndroidManifest.xml, maka akan terjadi eror seperti ini "android.content.ActivityNotFoundException:Unable to find explicit activity class."
Intent Filter
Berikutnya, perhatikan pada kode dengan tag intent-filter yang ada di dalam MainActivity.
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
Intent-filter merupakan mekanisme untuk menentukan bagaimana suatu activity dijalankan oleh Android Runtime (ART) atau Dalvik Virtual Machine (DVM).
- <action android:name="android.intent.action.MAIN" />
Baris di atas bermakna bahwa MainActivity menjadi entry point ke aplikasi.
- <category android:name="android.intent.category.LAUNCHER" />
Kode di atas menandakan bahwa MainActivity akan dikategorikan sebagai activity launcher. Ini menandakan bahwa activity ini akan muncul di halaman home screen dalam bentuk launcher.
Pindah Activity
Selanjutnya, perhatikan kode berikut.
- Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
- startActivity(moveIntent);
- val moveIntent = Intent(this@MainActivity, MoveActivity::class.java)
- startActivity(moveIntent)
Kita membuat suatu obyek Intent dengan cara seperti di atas dengan memberikan kelas Activity asal (MainActivity.this) dan kelas Activity tujuan (MoveActivity.class) pada konstruktor kelas Intent.
Kelas asal selalu menggunakan .this yang menandakan obyek kelas saat ini. Kelas tujuan selalu menggunakan .class.
Jika kita menggunakan code assistant (tekan ctrl + spasi) dari Android Studio, maka akan tampil rekomendasi (code hint) sebagai berikut:
Pada konteks di atas kita memilih Context packageContext, Class cls sebagai inputan untuk nilai constructor intent.
Kemudian perhatikan baris kode berikutnya.
- Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
- startActivity(moveIntent);
- val moveIntent = Intent(this@MainActivity, MoveActivity::class.java)
- startActivity(moveIntent)
startActivity(moveIntent) metode ini akan menjalankan activity baru tanpa membawa data. Obyek intent yang diinputkan adalah obyek moveIntent yang akan ketika kode ini dijalankan maka akan membuka MoveActivity.
Pada modul ini kita telah berhasil memindahkan satu Activity ke Activity lain dengan tidak membawa data. Pada bagian selanjutnya kita akan membuat suatu Intent yang di dalamnya akan membawa data ke Activity tujuan.
Intent Explicit
Selanjutnya kita akan membuat sebuah Intent yang di dalamnya akan membawa data ke Activity tujuan. Siap?
- Buka activity_main.xml, kemudian tambahkan satu tombol lagi di bawah tombol sebelumnya. Kode activity_main.xml kita pun, jadi seperti ini.
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="16dp">
- ...
- <Button
- android:id="@+id/btn_move_activity_data"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="16dp"
- android:text="@string/move_with_data" />
- </LinearLayout>
Setelah selesai dengan penambahan pada berkas activity_main.xml, maka lanjutkan dengan menambahkan beberapa baris berikut di MainActivity.java.
- public class MainActivity extends AppCompatActivity implements View.OnClickListener{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- ....
- Button btnMoveWithDataActivity = findViewById(R.id.btn_move_activity_data);
- btnMoveWithDataActivity.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()){
- case R.id.btn_move_activity:
- Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
- startActivity(moveIntent);
- break;
- case R.id.btn_move_activity_data:
- break;
- }
- }
- }
- class MainActivity : AppCompatActivity(), View.OnClickListener {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- ...
- val btnMoveWithDataActivity: Button = findViewById(R.id.btn_move_activity_data)
- btnMoveWithDataActivity.setOnClickListener(this)
- }
- override fun onClick(v: View) {
- when (v.id) {
- R.id.btn_move_activity -> {
- val moveIntent = Intent(this@MainActivity, MoveActivity::class.java)
- startActivity(moveIntent)
- }
- R.id.btn_move_activity_data -> {
- }
- }
- }
- }
- Selanjutnya, buat Activity baru lagi seperti cara sebelumnya dan beri nama MoveWithDataActivity.
- Lalu pada layout activity_move_with_data.xml kita tambahkan sebuah TextView ber-ID untuk menampilkan data yang dikirimkan dari Activity asal.
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="16dp">
- <TextView
- android:id="@+id/tv_data_received"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/data_received" />
- </RelativeLayout>
Selanjutnya pada MoveWithDataActivity.java kita kondisikan TextView seperti berikut ini :
- public class MoveWithDataActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_move_with_data);
- TextView tvDataReceived = findViewById(R.id.tv_data_received);
- }
- }
- class MoveWithDataActivity : AppCompatActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_move_with_data)
- val tvDataReceived: TextView = findViewById(R.id.tv_data_received)
- }
- }
Selanjutnya untuk menerima data dari Activity asal, kondisikan MoveWithDataActivity seperti berikut :
- public class MoveWithDataActivity extends AppCompatActivity {
- public static final String EXTRA_AGE = "extra_age";
- public static final String EXTRA_NAME = "extra_name";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_move_with_data);
- TextView tvDataReceived = findViewById(R.id.tv_data_received);
- String name = getIntent().getStringExtra(EXTRA_NAME);
- int age = getIntent().getIntExtra(EXTRA_AGE, 0);
- String text = "Name : " + name + ",\nYour Age : " + age;
- tvDataReceived.setText(text);
- }
- }
- class MoveWithDataActivity : AppCompatActivity() {
- companion object {
- const val EXTRA_AGE = "extra_age"
- const val EXTRA_NAME = "extra_name"
- }
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_move_with_data)
- val tvDataReceived: TextView = findViewById(R.id.tv_data_received)
- val name = intent.getStringExtra(EXTRA_NAME)
- val age = intent.getIntExtra(EXTRA_AGE, 0)
- val text = "Name : $name, Your Age : $age"
- tvDataReceived.text = text
- }
- }
Dan sekarang saatnya kita menambahkan obyek Intent pada MainActivity.java seperti baris yang ditebalkan
- @Override
- public void onClick(View v) {
- switch (v.getId()){
- case R.id.btn_move_activity:
- Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
- startActivity(moveIntent);
- break;
- case R.id.btn_move_activity_data:
- Intent moveWithDataIntent = new Intent(MainActivity.this, MoveWithDataActivity.class);
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy");
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
- startActivity(moveWithDataIntent);
- break;
- }
- }
- override fun onClick(v: View) {
- when (v.id) {
- R.id.btn_move_activity -> {
- val moveIntent = Intent(this@MainActivity, MoveActivity::class.java)
- startActivity(moveIntent)
- }
- R.id.btn_move_activity_data -> {
- val moveWithDataIntent = Intent(this@MainActivity, MoveWithDataActivity::class.java)
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy")
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5)
- startActivity(moveWithDataIntent)
- }
- }
- }
Maka MainActivity.java akan jadi seperti ini
- public class MainActivity extends AppCompatActivity implements View.OnClickListener{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button btnMoveActivity = findViewById(R.id.btn_move_activity);
- btnMoveActivity.setOnClickListener(this);
- Button btnMoveWithDataActivity = findViewById(R.id.btn_move_activity_data);
- btnMoveWithDataActivity.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_move_activity:
- Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
- startActivity(moveIntent);
- break;
- case R.id.btn_move_activity_data:
- Intent moveWithDataIntent = new Intent(MainActivity.this, MoveWithDataActivity.class);
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy");
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
- startActivity(moveWithDataIntent);
- break;
- }
- }
- }
- class MainActivity : AppCompatActivity(), View.OnClickListener {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- val btnMoveActivity: Button = findViewById(R.id.btn_move_activity)
- btnMoveActivity.setOnClickListener(this)
- val btnMoveWithDataActivity: Button = findViewById(R.id.btn_move_activity_data)
- btnMoveWithDataActivity.setOnClickListener(this)
- }
- override fun onClick(v: View) {
- when (v.id) {
- R.id.btn_move_activity -> {
- val moveIntent = Intent(this@MainActivity, MoveActivity::class.java)
- startActivity(moveIntent)
- }
- R.id.btn_move_activity_data -> {
- val moveWithDataIntent = Intent(this@MainActivity, MoveWithDataActivity::class.java)
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy")
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5)
- startActivity(moveWithDataIntent)
- }
- }
- }
- }
- Silakan jalankan aplikasi Anda, kemudian coba klik pada tombol Pindah Activity dengan Data. Seharusnya Anda sudah bisa memindahkan satu Activity ke Activity lain dengan membawa data.
Bedah Kode
Pada bagian sebelumnya Anda sudah mempelajari bagaimana memindahkan satu Activity ke Activity lain dengan membawa data. Dan itu sangat penting karena ketika kita mengembangkan suatu aplikasi Android yang kompleks, akan ada banyak Activity yang terlibat. Untuk memberikan pengalaman yang baik kepada pengguna, perpindahan Activity dengan data, sangat krusial.
Konstanta
Konstanta yaitu sebuah variabel yang nilainya tetap, biasanya digunakan sebagai key(kunci) yang dipakai untuk mengirim dan menerima data.
- public class MoveWithDataActivity extends AppCompatActivity {
- public static final String EXTRA_AGE = "extra_age";
- public static final String EXTRA_NAME = "extra_name";
- ...
- }
- class MoveWithDataActivity : AppCompatActivity() {
- companion object {
- const val EXTRA_AGE = "extra_age"
- const val EXTRA_NAME = "extra_name"
- }
- ...
- }
Untuk membuat Konstanta di Kotlin, kita bisa menggunakan kode const val, yang artinya variabel tersebut nilainya tetap dan tidak berubah.
Nah, supaya variabel ini bisa diakses dari kelas lain, anda harus memasukannya ke dalam companion object. Hal ini karena tidak ada tipe static di Kotlin, karena itulah anda perlu merubahnya menjadi object supaya bisa dikakses dari luar kelas.
Dengan begitu, saat di MainActivity kita bisa memanggil variabel tersebut dengan cara menulis kelasnya dulu, yaitu seperti ini MoveWithDataActivity.EXTRA_NAME.
Put Extra
Perhatikan kode di bawah ini.
- Intent moveWithDataIntent = new Intent(MainActivity.this, MoveWithDataActivity.class);
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy");
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
- startActivity(moveWithDataIntent);
- val moveWithDataIntent = Intent(this@MainActivity, MoveWithDataActivity::class.java)
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy")
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5)
- startActivity(moveWithDataIntent)
Perbedaan mendasar antara memindahkan Activity dengan membawa data atau tidak, adalah dengan menempatkan data ke obyek Intent pada baris ini.
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy");
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy")
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5)
Kita memanfaatkan metode putExtra() untuk mengirimkan data bersamaan dengan obyek Intent. Sedangkan metode putExtra() itu sendiri merupakan metode yang menampung pasangan key-value dan memiliki beberapa pilihan tipe input seperti berikut:
Hampir semua tipe data untuk input value didukung oleh metode putExtra().
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy");
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy")
Name | MoveWithDataActivity.EXTRA_NAME dimana EXTRA_NAME adalah variabel static bertipe data string dan bernilai “extra_name” pada MoveWithDataActivity.java. Penentuan nilai untuk key parameter untuk intent adalah bebas, di sini kami merekomendasikan format terbaik yang biasa diimplementasikan. |
Value | DicodingAcademy Boy dengan tipe data string. |
Get Data
Setelah data dikirimkan, selanjutnya adalah mengambil data tersebut.
Di sini kita akan mengirimkan data bertipe string ke MoveWithDataActivity. Di dalam MoveWithdataActivity kita akan mengambil nilai data berdasarkan key yang dikirimkan dengan menggunakan metode getIntent().getStringExtra(key). Implementasinya sebagai berikut:
- String name = getIntent().getStringExtra(EXTRA_NAME);
- val name = intent.getStringExtra(EXTRA_NAME)
Catatan : Key yang dikirimkan melalui putExtra() harus sama dengan key sewaktu mengambil nilai dari data yang dikirimkan melalui getStringExtra().
Dalam konteks di atas, key yang digunakan untuk mengirim dan mengambil nilai data adalah sama, yaitu EXTRA_NAME (yang bernilai “extra_name”). Nilai dari data yang dikirimkan melalui intent disimpan ke dalam variabel name bertipe data string.
Fungsi dari EXTRA_NAME
sendiri yaitu sebagai Key. Seperti yang dijelaskan pada modul, untuk mengirim data dengan intent kita perlu mengirimnya dalam format putExtra(Key,Value). Dengan Key bertindak sebagai kunci yang dipakai untuk mengambil data di activity tujuannya, dan value adalah data yang akan dikirimkan. Jadi kalau dalam bahasa gampangnya dalam bentuk dialog seperti ini:kode : "Aku mau ambil data nih?"
sistem : "data yang mana? data kan banyak?"
kode : "yang key-nya 'EXTRA_NAME
sistem : "ohh oke de', ini data value-nya"
sistem : "data yang mana? data kan banyak?"
kode : "yang key-nya 'EXTRA_NAME
' sis (red: sistem)"sistem : "ohh oke de', ini data value-nya"
Begitu juga dengan variable age.
- int age = getIntent().getIntExtra(EXTRA_AGE, 0);
- val age = intent.getIntExtra(EXTRA_AGE, 0)
Nilai dari variabel age yang bertipe data integer berasal dari getIntent().getIntExtra(Key, nilai default). Key yang digunakan untuk mengirimkan dan mengambil data adalah EXTRA_AGE (yang bernilai “extra_age”). Nilai default di sini merupakan nilai yang akan digunakan jika ternyata datanya kosong. Data kosong atau nilainya null bisa terjadi ketika datanya memang tidak ada, atau key-nya tidak sama.
Selamat! Anda telah mempelajari dua intent explicit dengan atau tidak membawa data.
Sebelumnya, mengirimkan data bernilai tunggal dari satu Activity ke Activity lain adalah hal yang mudah. Bernilai tunggal karena data yang dikirimkan berasal dari satu tipe data.
Misalnya pada contoh di atas, pengiriman nilai data name dan age dilakukan secara individu. Yang satu bertipe data string dan yang lainnya bertipe data integer.
Sekarang pertanyaanya bagaimana Anda bisa mengirimkan data dalam bentuk Plain Old Java Object (POJO) dari satu Activity ke Activity lain melalui intent?
Caranya adalah dengan mengubah obyek POJO yang Anda miliki ke dalam bentuk obyek parcelable. Di Android Studio sudah ada fasilitas plugin bernama Android Parcelable Generator untuk memudahkan proses tersebut.
Codelab Intent Implicit
Anda sudah belajar bagaimana menggunakan intent dengan tipe eksplisit. Sekarang saatnya Anda melanjutkan ke intent dengan tipe implisit.
- Buka kembali activity_main.xml tambahkan satu tombol lagi sebagai berikut:Sehingga file activity_main.xml kita sekarang menjadi:
- <Button
- android:id="@+id/btn_dial_number"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="16dp"
- android:text="@string/dial_number" />
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="16dp">
- <Button
- android:id="@+id/btn_move_activity"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="16dp"
- android:text="@string/move_activity" />
- <Button
- android:id="@+id/btn_move_activity_data"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="16dp"
- android:text="@string/move_with_data" />
- <Button
- android:id="@+id/btn_dial_number"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="16dp"
- android:text="@string/dial_number" />
- </LinearLayout>
Sekarang, buka kembali MainActivity.java dan lanjutkan menginisialisasi button yang sudah ditambahkan:
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- ...
- Button btnDialPhone = findViewById(R.id.btn_dial_number);
- btnDialPhone.setOnClickListener(this);
- }
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- ...
- val btnDialPhone: Button = findViewById(R.id.btn_dial_number)
- btnDialPhone.setOnClickListener(this)
- }
Kemudian dengan melakukan casting tombol Dial Number, set listener dan menambahkan action ketika tombol diklik.
- @Override
- public void onClick(View v) {
- switch (v.getId()){
- ...
- case R.id.btn_dial_number:
- String phoneNumber = "081210841382";
- Intent dialPhoneIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+phoneNumber));
- startActivity(dialPhoneIntent);
- break;
- }
- }
- override fun onClick(v: View) {
- when (v.id) {
- ...
- R.id.btn_dial_number -> {
- val phoneNumber = "081210841382"
- val dialPhoneIntent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:$phoneNumber"))
- startActivity(dialPhoneIntent)
- }
- }
- }
Sehingga kode keseluruhan untuk kelas MainActivity.java saat ini adalah
- public class MainActivity extends AppCompatActivity implements View.OnClickListener{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button btnMoveActivity = findViewById(R.id.btn_move_activity);
- btnMoveActivity.setOnClickListener(this);
- Button btnMoveWithDataActivity = findViewById(R.id.btn_move_activity_data);
- btnMoveWithDataActivity.setOnClickListener(this);
- Button btnDialPhone = findViewById(R.id.btn_dial_number);
- btnDialPhone.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()){
- case R.id.btn_move_activity:
- Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
- startActivity(moveIntent);
- break;
- case R.id.btn_move_activity_data:
- Intent moveWithDataIntent = new Intent(MainActivity.this, MoveWithDataActivity.class);
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy");
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
- startActivity(moveWithDataIntent);
- break;
- case R.id.btn_dial_number:
- String phoneNumber = "081210841382";
- Intent dialPhoneIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+phoneNumber));
- startActivity(dialPhoneIntent);
- break;
- }
- }
- }
- class MainActivity : AppCompatActivity(), View.OnClickListener {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- val btnMoveActivity: Button = findViewById(R.id.btn_move_activity)
- btnMoveActivity.setOnClickListener(this)
- val btnMoveWithDataActivity: Button = findViewById(R.id.btn_move_activity_data)
- btnMoveWithDataActivity.setOnClickListener(this)
- val btnDialPhone: Button = findViewById(R.id.btn_dial_number)
- btnDialPhone.setOnClickListener(this)
- }
- override fun onClick(v: View) {
- when (v.id) {
- R.id.btn_move_activity -> {
- val moveIntent = Intent(this@MainActivity, MoveActivity::class.java)
- startActivity(moveIntent)
- }
- R.id.btn_move_activity_data -> {
- val moveWithDataIntent = Intent(this@MainActivity, MoveWithDataActivity::class.java)
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "DicodingAcademy Boy")
- moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5)
- startActivity(moveWithDataIntent)
- }
- R.id.btn_dial_number -> {
- val phoneNumber = "081210841382"
- val dialPhoneIntent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:$phoneNumber"))
- startActivity(dialPhoneIntent)
- }
- }
- }
- }
Setelah selesai, silakan jalankan lagi aplikasi Anda. Yeay, Anda sudah bisa men-dial sebuah nomor telepon melalui aplikasi bawaan dari peranti anda. Selamat!
Bedah Kode
Intent Implicit
- String phoneNumber = "081210841382";
- Intent dialPhoneIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber));
- startActivity(dialPhoneIntent);
- val phoneNumber = "081210841382"
- val dialPhoneIntent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:$phoneNumber"))
- startActivity(dialPhoneIntent)
Baru saja kita mengimplementasikan penggunaan intent secara implicit untuk melakukan proses dial sebuah nomor telepon. Pada bagian new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+phoneNumber)); kita menggunakan inputan new Intent(ACTION, Uri); pada konstruktor sewaktu menciptakan obyek Intent di mana:
Action : Intent.ACTION_DIAL
Uri : Uri.parse("tel:"+phoneNumber)
Variabel ACTION_DIAL menentukan intent filter dari aplikasi-aplikasi yang bisa menangani action tersebut. Di sini aplikasi yang memiliki kemampuan untuk komunikasi akan muncul pada opsi pilihan, sebagaimana ditampilkan ke pengguna.
Selain ACTION_DIAL, di Android sudah tersedia berbagai action yang tinggal didefinisikan sewaktu menciptakan obyek Intent untuk mengakomodir berbagai tujuan.
Silakan cek link berikut untuk detailnya:
Apa itu URI (Uniform Resource Identifier)
Buat yang belum tau apa itu Uri, berikut penjelasan singkatnya:
Uri adalah sebuah untaian karakter yang digunakan untuk mengidentifikasi nama, sumber, atau layanan di internet sesuai dengan RFC 2396. Pada Uri.parse("tel:"+phoneNumber) kita melakukan parsing Uri dari bentuk teks string menjadi sebuah obyek uri dengan menggunakan metode static parse(String). Secara struktur, dibagi menjadi:
Dimana “tel” adalah sebuah skema yang disepakati untuk sumber daya telepon dan phoneNumber adalah variabel string yang bernilai “081210841382”. Skema lain dari Uri seperti “geo” untuk peta, “http” untuk browser sisanya bisa dilihat di halaman ini:
Proses Intent Implicit
Pada prosesnya, pemanggilan intent secara implicit akan berjalan sesuai dengan diagram di bawah ini.
- Aplikasi kita menjalankan intent untuk ACTION_DIAL melalui startActivity().
- Sistem Android akan melakukan seleksi terhadap semua aplikasi yang memiliki kemampuan untuk menangani action tersebut. Sistem Android akan menentukan aplikasi mana saja yang bisa memproses action berdasarkan intent filter yang telah ditentukan di berkas AndroidManifest.xml pada masing-masing aplikasi.
Sistem Android akan menampilkan opsi aplikasi-aplikasi mana saja yang bisa menangani action tersebut ke pengguna.
Pengguna memilih salah satu opsi aplikasi dan kemudian sistem Android akan me-routing ke activity pada aplikasi yang dipilih yang memiliki intent-filter untuk aksi ACTION_DIAL. - Aplikasi yang dipilih pun muncul di layar dengan nomor telepon yang sudah diatur.
Anda sudah mempelajari 3 buah intent secara eksplisit dan 1 buah intent secara implisit. Selamat!
Untuk source code materi , silakan unduh di tautan berikut ini: