Saturday, May 9, 2020

MOBILE PROGRAMMING

Pertemuan 6

PEMBUATAN APLIKASI ALARM MANAGER


 Penggunaan Service di Alarm Manager Adakalanya kita membutuhkan perlu suatu mekanisme untuk mengulang sebuah proses di waktu tertentu. Misalnya, kita ingin memiliki fungsi pengingat (reminder) pada aplikasi event, jadwal tayang film di bioskop, atau aplikasi alarm untuk mengingatkan kita untuk bangun di pagi hari. Disinilah alarm manager berperan penting.

Alarm manager akan memberikan kemudahan bagi aplikasi untuk melakukan operasi berbasis waktu diluar daur hidup aplikasi itu sendiri.  Contohnya seperti yang baru saja disebutkan diatas. Umumnya alarm memiliki beberapa karakteristik, antara lain :
1. Dapat menjalankan obyek intent berdasarkan waktu dan interval yang ditentukan. 
2. Bisa bekerja dengan baik dengan broadcast receiver untuk menjalankan komponen lain seperti service untuk melakukan operasi tertentu. 
3. Alarm berjalan diluar daur hidup aplikasi induknya sehingga kita bisa merancang fungsi alarm untuk melakukan sebuah aksi ketika aplikasi sedang tidak dijalankan bahkan ketika peranti dalam keadaan idle atau sleep. 
4. Esensi utama dari alarm manager adalah untuk meminimalkan penggunaan resource dan menghindari penggunaan timer dan background service yang berkepanjangan untuk melakukan operasi atau aksi yang dibutuhkan. 

Penggunaan dan perancangan alarm manager yang tepat akan membuat aplikasi kita menjadi lebih baik, serta tentunya memberikan pengalaman yang juga berkesan. Namun sebaliknya desain yang buruk akan menjadi bumerang bagi aplikasi kita. Akibat dari rancangan yang tidak sesuai akan menguras baterai di peranti kita.

Penggunaan alarm manager yang baik adalah dengan menerapkan cara berikut ini:

  1.  Lakukan hanya untuk proses di lokal 
  2.  Jaga frekuensi alarm yang dijalankan dengan interval yang tidak pendek 
  3.  Jika tidak terlalu penting, hindari penggunaan tipe alarm yang dapat membangunkan peranti seperti RTC_WAKEUP 
  4.  Jika alarm manager digunakan untuk menjadwalkan scheduling task yang terhubung ke jaringan dan melakukan request ke server, misalnya unduh data terbaru atau sinkronisasi data, maka hindari penggunaan setRepeating() dan gunakan setInExactRepeating() dengan penggunaan tipe alarm berbasis ELAPSED_REALTIME. Pendekatan tersebut merupakan strategi untuk mengelompokkan proses alarm dari aplikasi yang berbeda dengan dijalankan secara bersamaan agar lebih menghemat daya baterai
Catatan : Di atas API 19 KitKat semua pemanggilan repeating alarm adalah menggunakan in exact repeating.

Kali ini kita akan membuat sebuah proyek sederhana dengan skenario seperti berikut.
1. Aplikasi akan memiliki kemampuan untuk melakukan one-time-execution alarm dan alarm yang berulang berdasarkan waktu yang ditentukan.
2. Aplikasi akan menyimpan beberapa nilai untuk kedua tipe alarm tersebut.
3. Aplikasi akan menampilkan notifikasi dengan suara dan getar ketika alarm dijalankan.


mari kita mulai :
1. Buat proyek baru dengan nama MyAlarmManager yang berjenis Empty Activity dan dengan konfigurasi default tentunya.
2. Pada activity_main.xml sesuaikan kodenya menjadi seperti berikut.


Sehingga tampilan aplikasi dari activity_main.xml ketika dijalankan seperti berikut

3. Setelah itu kita akan membuat sebuah mekanisme penyimpanan sederhana dengan menggunakan SharedPreference. Untuk itu, mari kita membuat sebuah kelas java baru dengan nama AlarmPreference.  Caranya, klik kanan pada package project yang ada saat ini → new → Java Class. Ketika sudah selesai, lengkapi kodenya menjadi seperti berikut.

4. Setelah itu, buat kelas BroadcastReceiver bernama AlarmReceiver dan lengkapi kodenya seperti berikut. 

Untuk keperluan ikon alarm, kami menggunakan ikon dari material design spec yang dapat dicari di halaman ini, dibagian kategori peranti. Setelah diunduh, masukkan ikon ke dalam folder res → drawable.

5. Setelah kita membuat sebuah AlarmReceiver dan menyesuaikan kode pada activity_main.xml, sekarang saatnya kita melengkapi MainActivity kodenya sehingga menjadi seperti ini :

6. Jangan lupa untuk menambahkan permission pada AndroidManifest.xml beberapa baris berikut.

1. <uses-permission android:name="android.permission.VIBRATE" />
2. <uses-permission android:name="android.permission.WAKE_LOCK" />

Ketika mengimport komponen Calendar, pastikan Anda menggunakan java.util.calendar. Jangan sampai keliru dengan komponen calendar lainnya yang baru ditambahkan pada API 24.

7. Jika sudah selesai, silakan jalankan aplikasi Anda. Dengan menekan tombol yang ada pada sebelah TextView tanggal dan waktu, Anda dapat mengganti tanggal dan waktu yang diinginkan. Isikan juga pesan alarm yang diinginkan. Setelah tanggal, waktu dan pesan telah Anda isi, lanjutkan dengan klik tombol SET ONE TIME ALARM dan silakan tunggu sampai waktu yang ditentukan, sehingga alarm akan dijalankan. Jika sukses, maka waktu yang kita set di awal akan tampil pada obyek TextView yang telah disediakan. 


Ketika waktunya sudah sesuai, maka alarm akan dijalankan dan akan menampilkan notifikasi dengan getaran dan suara seperti berikut. 

Anda sudah bisa mengimplementasikan one-time-alarm untuk tanggal dan jam yang telah ditentukan. Fungsi ini bisa berguna untuk beragam fitur lain. Misalnya jika Anda membuat aplikasi tentang event, pasti fungsi ini akan sangat berguna sebagai mekanisme pengingat. 

Friday, May 8, 2020

MOBILE PROGRAMMING

Pertemuan 6

KOMPONEN ANDROID SERVICE


Pengertian Service

• Sebelumnya telah belajar mengenai activity dan implementasinya. Activity adalah komponen yang memberikan pengalaman kepada pengguna secara langsung. Pengguna dapat melihat dan berinteraksi diatasnya. 
• Service berada pada sisi yang lain, komponen ini tidak memiliki antarmuka dan bahkan pengguna tidak akan akan tahu bagaimana dia bekerja. Pengalaman yang diberikan oleh service hanya berupa proses yang tidak terlihat. Ia digunakan untuk menjalankan beragam macam proses yang memakan waktu lama. 
• Walaupun berjalan secara background, pada dasarnya service dan komponen Android lainnya berjalan pada satu proses dan thread yang sama yaitu main thread atau ui thread. Bekerja di background bukan berarti ia bekerja secara asynchronous. Service tetap membutuhkan thread terpisah jika kita ingin melakukan proses yang membutuhkan komputasi intensif atau yang memakan waktu


Contoh pemanfaatan service

• Aplikasi sosial media atau aplikasi yang memiliki kemampuan untuk menerima push notification. Aplikasi semacam ini pasti memiliki sebuah service yang berjalan dalam posisi stand by untuk selalu menerima pesan yang masuk.
• Aplikasi chat juga membutuhkan service untuk melakukan pengiriman dan menerima pesan yang dikirimkan oleh pengguna.
• Aplikasi pemutar musik juga melakukan hal yang sama. Untuk memberikan pengalaman yang lebih baik kepada pengguna, aplikasi pemutar musik biasanya meletakkan proses streaming atau memainkan musik di komponen service dengan tetap mempertahankan integrasi dengan komponen lain, misalnya notifikasi. dll

2 BENTUK SERVICE

• Started Service berjenis ini adalah tipe yang dijalankan oleh komponen lain, misal activity. Sekali dijalankan, service ini akan berjalan selama belum dimatikan atau proses yang dijalankan selesai. Sevice akan tetap berjalan walaupun komponen yang lain dimatikan oleh sistem Android. Umumnya penggunaan service ini adalah untuk melakukan proses yang tidak memberikan nilai balik ke komponen yang memanggilnya. Contohnya adalah, mengunduh atau mengunggah berkas.

• Bound Service jenis ini merupakan tipe service yang dijalankan oleh komponen lain, namun saling mengikat. Hubungan yang terjadi antar kedua komponen tersebut seperti client-server. Bisa saling menerima hasil dan menerima request yang ada. Pada service ini dimungkinkan terjadi proses IPC (Interprocess Communication). Service ini akan tetap berjalan di background selama masih ada komponen lain yang mengikatnya. Jika tidak, maka Service akan dimatikan oleh sistem. Aplikasi pemutar musik merupakan salah satu jenis aplikasi yang mengimplementasikan service jenis ini.



Latihan Penerapan Service
1. Untuk melihat jalannya service, buatkan tampilan seperti dibawah.
Nama project : MyService
Activity : Empty Activity

Anda sudah paham service secara garis besar berikut pemanfaatannya. Sekarang saatnya kita menerapkannya. 
1. Baik, buat proyek baru dengan nama MyService. Pilih Empty Activity dengan pilihan default pada set up proyek. Setelah proyek tercipta, lengkapi activity_main.xml dengan contoh seperti ini: 

2. Pada MainActivity.java silakan lengkapi kode-nya menjadi sebagai berikut


3. Tampilan yang seharusnya ada pada MainActivity, adalah seperti ini
4. Lanjut, buat kelas service bernama OriginService dengan cara klik kanan pada package project → New → Service → Service. OriginService akan inherit (extends) kepada kelas Service. 
5. Selanjutnya pada dialog yang tampil, isikan nama kelas service yang diinginkan. Di sini kita menamainya sebagai OriginService dan biarkan exported dan enabled tercentang. Klik Finish untuk menyelesaikan proses. 


6. Selanjutnya, buka berkas AndroidManifest.xml pada package manifest dan perhatikan isi berkas tersebut. Service yang baru saja kita buat sudah ada didalam tag <application> 


7. Berkas AndroidManifest sudah dibuat secara otomatis. Dengan demikian kita sudah bisa menjalankan kelas service tersebut. Namun, sebelum menjalankan aplikasi, lengkapi kode pada OriginService menjadi seperti berikut : 


8. Selanjutnya pada MainActivity.java di metode onClick() pada case R.id.btn_start_service tambahkan baris berikut : 

 Intent mStartServiceIntent = new Intent(MainActivity.this, OriginService.class);
                startService(mStartServiceIntent);

9. Sehingga kode pada metode onClick() menjadi seperti ini :

10. Sekarang jalankan aplikasi. Klik tombol ‘start service’ dan perhatikan pada lognya. OriginService telah dijalankan dan tidak akan pernah mati sampai dimatikan oleh sistem atau metode stopSelf() atau stopService() dijalankan.

11. Baik, sekarang kita akan menambahkan sebuah inner class AsyncTask. Ia seakan-akan menjalankan sebuah proses secara asynchronous dan mematikan/menghentikan dirinya sendiri dengan memanggil metode stopSelf(). Lengkapi kodenya menjadi sebagai berikut:


12. Jalankan aplikasinya. Klik tombol ‘start service’ dan perhatikan log-nya. Service dijalankan secara asynchronous dan mematikan dirinya sendiri setelah proses selesai. 

13. Jika berhasil dijalankan, pada log androiod monitor akan seperti ini : 
09-22 09:52:25.028 10209-10209/com.contoh.myserviceapp D/OriginService: OriginService dijalankan 
09-22 09:52:28.074 10209-10209/com.contoh.myserviceapp D/OriginService: StopService 
09-22 09:52:28.078 10209-10209/com.contoh.myserviceapp D/OriginService: onDestroy()

sekian dari saya percobaan pembuatan aplikasi pertemuan 6 semoga bermanfaat 😇🙏
NOTE : untuk pembuatan aplikasi " Latihan: Penggunaan Service di Alarm Manager " akan saya berikan dipostingan berikutnya 😁

Thursday, May 7, 2020

MOBILE PROGRAMMING

Pertemuan 5


KOMPONEN ANDROID INTENT

Tentang Intent

Intent adalah mekanisme untuk melakukan sebuah action dan komunikasi antar komponen aplikasi misal activity, services, dan broadcast receiver. Ada tiga penggunaan umum intent dalam aplikasiAndroid yaitu:
• Memindahkan satu activity ke activity lain dengan atau tidak membawa data.
• Menjalankan background service, misalnya melakukan sinkronisasi ke server dan menjalankan proses berulang (periodic/scheduler task).
• Mengirimkan obyek broadcast ke aplikasi yang membutuhkan. Misal, ketika aplikasi membutuhkan proses menjalankan sebuah background service setiap kali aplikasi selesai melakukan booting. Aplikasi harus bisa menerima obyek broadcastyang dikirimkan oleh sistemAndroid untuk event booting tersebut.

Intent memiliki dua bentuk yaitu:
1. Explicit Intent
 Adalah tipe Intent yang digunakan untuk menjalankan komponen dari dalam sebuah aplikasi. Explicit intent bekerja dengan menggunakan nama kelas yang dituju misal : ac.id.nusamandiri.activity.DetailActivity. Umumnya intent ini digunakan untuk mengaktifkan komponen pada satu aplikasi.

2. Implicit Intent. 
Adalah tipe intent yang tidak memerlukan detail nama kelas yang ingin diaktifkan. Model ini memungkinkan komponen dari aplikasi lain bisa merespon request intent yang dijalankan. Penggunaan tipe intent ini umumnya diperuntukan untuk menjalankan fitur/fungsi dari komponen aplikasi lain. Contohnya ketika kita membutuhkan fitur untuk mengambil foto. Daripada membuat sendiri fungsi kamera, lebih baik kita menyerahkan proses tersebut pada aplikasi kamera bawaan dari peranti atau aplikasi kamera lain yang telah terinstal sebelumnya di peranti. Hal yang sama misalnya ketika kita membutuhkan fungsi berbagi konten. Kita bisa memanfaatkan intent untuk menampilkan aplikasi mana saja yang bisa menangani fitur tersebut. Implementasi implicit intent ini akan sangat memudahkan bagi pengembang agar tetap fokus pada proses bisnis inti dari aplikasi yang dikembangkan.


Latihan Intent
Latihan ini menitik beratkan pada implementasi intent untuk melakukan perpindahan dari activity ke activity lain, dengan atau tidak membawa data. Beberapa bagian dari latihan ini akan menjawab beberapa pertanyaan umum dalam pengembangan aplikasiAndroid sebagai berikut: 
• Bagaimana berpindah dari satu activity ke activity lain? 
• Bagaimana berpindah dari satu activity ke activity lain dengan membawa data?
   o Single value dari suatu variabel.
   o 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

Logika Dasar 
Berpindah dari satu Activity ke Activity lain dengan membawa data. Activity asal akan mengirimkan data melalui Intent danActivity tujuan akan menerima data yang dikirimkan.

1. Buat Project baru diAndroid Studio dengan kriteria sebagai berikut: 
o Nama Project : AppBelajarIntent 
o Target & Minimum Target SDK: Phone and Tablet, Api level 15 
o Tipe Activity : Empty Activity 
o Activity Name : MainActivity

2. Buatkan tampilan antarmuka seperti dibawah

3. Kita akan memiliki 5 tombol dengan fungsi yang berbeda-beda dan 1 buah TextView untuk menampilkan data yang berasal dari intent. Baik, kita akan mulai selangkah demi selangkah dimulai dari tombol yang paling atas. Kondisikan activity_main.xml menjadi seperti ini:


Jangan lupa untuk menambahkan file dimens.xml secara manual di dalam res → values.  Dan isikan file dimens.xml  seperti berikut


4. Juga jangan lupa atur colors.xml didalam res → values. dan isikan sebagai berikut: 


5. Lalu untuk MainActivity.java tambahkan beberapa baris seperti ini. 
0. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
1. private Button btnMoveActivity;
2. @Override
3. protected void onCreate(Bundle savedInstanceState) {
4. super.onCreate(savedInstanceState);
5. setContentView(R.layout.activity_main);
6.
7. btnMoveActivity = (Button)findViewById(R.id.btn_move_activity);
8. btnMoveActivity.setOnClickListener(this);
9. }
10. @Override
11. public void onClick(View v) {
12. switch (v.getId()){
13. case R.id.btn_move_activity:
14. break;
15. }
16. }
17. }

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

7. Untuk menandakan bahwa perpindahan activity berhasil, silakan tambahkan satu TextView dan kondisikan activity_move.xml menjadi seperti berikut.

0.//<?xml version="1.0" encoding="utf-8"?> 
1.//<RelativeLayout //xmlns:android="http://schemas.android.com/apk/res/android" 
2.//xmlns:tools="http://schemas.android.com/tools"
3.//android:layout_width="match_parent"
4.//android:layout_height="match_parent"
5.//android:paddingBottom="@dimen/activity_vertical_margin"
6.//android:paddingLeft="@dimen/activity_horizontal_margin"
7.//android:paddingRight="@dimen/activity_horizontal_margin"
8.//android:paddingTop="@dimen/activity_vertical_margin"
9.//tools:context="id.ac.nusamandiri.belajarintentapp.MoveActivity">
10.// 11.//android:layout_width="match_parent"
12.//android:layout_height="wrap_content"
13.//android:text="Ini Adalah MoveActivity"/>
14.//</RelativeLayout>



8. Setelah activity tujuan sudah berhasil diciptakan, sekarang saatnya menambahkan suatu intent pada method onClick() di MainActivity.java menjadi sebagai berikut.


0. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
1. private Button btnMoveActivity;
2. @Override
3. protected void onCreate(Bundle savedInstanceState) {
4. super.onCreate(savedInstanceState);
5. setContentView(R.layout.activity_main);
6. btnMoveActivity = (Button)findViewById(R.id.btn_move_activity);
7. btnMoveActivity.setOnClickListener(this);
8. }
9. @Override
10. public void onClick(View v) {
11. switch (v.getId()){
12. case R.id.btn_move_activity:
13. Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
14. startActivity(moveIntent);
15. break;
16. }
17. }
18. }

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 ‘Berpindah Activity’. Hasil:

klik back maka akan kembali ke menu utama

Bedah Kode
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. untuk mengecek silahkan klik app ➝ manifests ➝ AndroidManifest.xml

Perhatikan bahwa MoveActivity sudah teregistrasi di AndroidManifest.xml dan sekarang sudah aman jika kita melakukan perpindahan activity dari MainActivity ke MoveActivity. Umumnya, jika kita lupa meregistrasikan Activity baru ke dalam berkas AndroidManifest.xml akan terjadi error seperti ini "android.content.ActivityNotFoundException:Unable to find explicit activity class". Berikutnya, apakah Anda memahami maksud dari baris ini?


1. <intent-filter>
2.          <action android:name="android.intent.action.MAIN" />
3.          <category android:name="android.intent.category.LAUNCHER" />
4. </intent-filter> 

Intent-filter merupakan mekanisme untuk menentukan bagaimana suatu activity dijalankan oleh Android Runtime (ART) atau Dalvik Virtual Machine (DVM).

.1. <action android:name="android.intent.action.MAIN" /> 

Baris di atas bermakna bahwa MainActivity memiliki intent action utama dari keseluruhan activity yang ada di suatu Aplikasi.

1. <category android:name="android.intent.category.LAUNCHER" />
Kode di atas menandakan bahwa MainActivity akan dikategorikan sebagai activity launcher. Activity tersebut akan diluncurkan pertama kali ketika pengguna menekan ikon aplikasi pada peranti Android.

Selanjutnya

1. Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);

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.

Selanjutnya kita akan membuat sebuah intent yang didalamnya akan membawa data ke activity tujuan. Anda Siap?
1. Buka activity_main.xml, kemudian tambahkan satu tombol lagi dibawah tombol sebelumnya, ketikkan script di bawah ke activity_main.xml

<Button
        android:id="@+id/btn_move_activity_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="BERPINDAH ACTIVITY DENGAN DATA"
android:layout_marginBottom="@dimen/activity_vertical_margin"/> 

2. Setelah selesai dengan penambahan pada berkas activity_main.xml, maka lanjutkan dengan menambahkan beberapa baris berikut di MainActivity.java

1. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
2.    private Button btnMoveActivity;
3.    private Button btnMoveWithDataActivity;
4.    @Override
5.    protected void onCreate(Bundle savedInstanceState) {
6.        super.onCreate(savedInstanceState);
7.        setContentView(R.layout.activity_main);
8.        btnMoveActivity = (Button)findViewById(R.id.btn_move_activity); 9.        btnMoveActivity.setOnClickListener(this);
10.        btnMoveWithDataActivity = (Button)findViewById(R.id.btn_move_activity_data);
11.        btnMoveWithDataActivity.setOnClickListener(this);
12.    }
13.    @Override
14.    public void onClick(View v) {
15.        switch (v.getId()){
16.            case R.id.btn_move_activity:
17.                Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
18.                startActivity(moveIntent);
19.                break;
20.            case R.id.btn_move_activity_data:
21.                break;
22.        }
23.    }
24. }

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

1. <?xml version="1.0" encoding="utf-8"?>
2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3.    xmlns:tools="http://schemas.android.com/tools"
4.    android:layout_width="match_parent"
5.    android:layout_height="match_parent"
6.    android:paddingBottom="@dimen/activity_vertical_margin"
7.    android:paddingLeft="@dimen/activity_horizontal_margin"
8.    android:paddingRight="@dimen/activity_horizontal_margin"
9.    android:paddingTop="@dimen/activity_vertical_margin"
10.    tools:context="id.ac.nusamandiri.associate.belajarintentapp.MoveWithData Activity">
11.    <TextView
12.        android:id="@+id/tv_data_received"
13.        android:layout_width="match_parent"
14.        android:layout_height="wrap_content"
15.        android:text="Data Received"/>
16. </RelativeLayout>

4. Selanjutnya pada MoveWithDataActivity.java kita kondisikan menjadi seperti berikut:

1. public class MoveWithDataActivity extends AppCompatActivity {
2.    public static String EXTRA_AGE = "extra_age";
3.    public static String EXTRA_NAME = "extra_name";
4.    private TextView tvDataReceived;
5.    @Override
6.    protected void onCreate(Bundle savedInstanceState) {
7.        super.onCreate(savedInstanceState);
8.        setContentView(R.layout.activity_move_with_data);
9.        tvDataReceived = (TextView)findViewById(R.id.tv_data_received);
10.        String name = getIntent().getStringExtra(EXTRA_NAME);
11.        int age = getIntent().getIntExtra(EXTRA_AGE, 0);
12.        String text = "Name : "+name+", Your Age : "+age;
13.        tvDataReceived.setText(text);
14.    }
15. } 

5. Dan sekarang saatnya kita menambahkan obyek Intent pada MainActivity.java menjadi seperti berikut :
1. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
2.    private Button btnMoveActivity;
3.    private Button btnMoveWithDataActivity;
4.    @Override
5.    protected void onCreate(Bundle savedInstanceState) {
6.        super.onCreate(savedInstanceState);
7.        setContentView(R.layout.activity_main);
8.        btnMoveActivity = (Button)findViewById(R.id.btn_move_activity);
9.        btnMoveActivity.setOnClickListener(this);
10.  btnMoveWithDataActivity=(Button)findViewById(R.id.btn_move_activity_d ata);
11.        btnMoveWithDataActivity.setOnClickListener(this);
12.    }
13.    @Override
14.    public void onClick(View v) {
15.        switch (v.getId()){
16.            case R.id.btn_move_activity:
17.                Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
18.                startActivity(moveIntent);
19.                break;
20.            case R.id.btn_move_activity_data:
21.                Intent moveWithDataIntent = new Intent(MainActivity.this, MoveWithDataActivity.class);
22.                moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAM E, "Muhammad Luthfi");
23.                moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 23);
24.                startActivity(moveWithDataIntent);
25.                break;
26.        }
27.    }
28. } 

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

hasil setelah mengklik tombol Berpindah Activity Dengan Data


Membawa data dengan Plain Old Java Object (POJO)
  POJO adalah sebuah kelas Java biasa yang tidak bergantung dengan kelas lain. Umumnya kelas POJO ini disebut sebagai kelas Java yang memiliki properti/variabel dan metode setter-getter

Kegunaan:
POJO akan membantu kita saat aplikasi semakin kompleks. Contohnya POJO bisa kita gunakan untuk melakukan koneksi ke server untuk requestAPI atau akses ke database lokal dengan SQLite.

Selain POJO, Android juga memiliki obyek parcelable POJO. Obyek ini akan lebih memudahkan kita untuk melakukan pengiriman data dari satu activity ke activity lainnya.

1. public class MyBean {
2. 
3.     private String someProperty;
4. 
5.     public String getSomeProperty() {
6.          return someProperty;
7.     }
8. 
9.     public void setSomeProperty(String someProperty) {
10.         this.someProperty = someProperty;
11.     }
12. }
contoh get setter

1. Sebelum membuat obyek parcelable, kita buat kelas Java POJO terlebih dahulu. Caranya, klik kanan pada package utama proyek → New → Java Class

2. Pada dialog, isikan nama kelas dengan ‘Person’. Lalu klik OK.

3. Setelah selesai terbentuk kelas Person, kondisikan kelas tersebut menjadi seperti ini.
1. public class Person {
2.    private String name;
3.    private int age;
4.    private String email;
5.    private String city;
6.    public String getName() {
7.        return name;
8.    }
9.    public void setName(String name) {
10.        this.name = name;
11.    }
12.    public int getAge() {
13.        return age;
14.    }
15.    public void setAge(int age) {
16.        this.age = age;
17.    }
18.    public String getEmail() {
19.        return email;
20.    }
21.    public void setEmail(String email) {
22.        this.email = email;
23.    }
24.    public String getCity() {
25.        return city;
26.    }
27.    public void setCity(String city) {
28.        this.city = city;
29.    }
30. } 

Anda tidak perlu menulis satu per satu metode setter-getter nya, di Android Studio tersedia fasilitas generator untuk hal tersebut. Caranya, setelah Anda menentukan variabel apa saja yang akan digunakan lakukan, lakukan beberapa langkah sebagai berikut :

  1. Klik kanan pada workspace, pilih Generate. 
  2. Pilih Getter and Setter. 
  3. Pilih semua variabel dengan cara Ctrl+A pada windows dan Command+A pada mac. Bila sudah, maka klik OK. Secara otomatis metode setter dan getter masing-masing variabel akan dibuatkan.

Selanjutnya kita akan menambahkan plugin Android Parcelable Generator pada Android Studio. Plugin ini berguna untuk mengubah kelas POJO menjadi obyek Parcelable. Langkahlangkahnya sebagai berikut : 
1. Buka settings dengan cara File → Settings pada Windows dan Android Studio → Preferences pada Mac.  
2. Pilih menu Plugin. Dan inputkan "Android Parcelable" pada search box kemudian tekan Enter. 
3. Klik browse, dengan ini kita memerintahkan Android Studio untuk melakukan pencarian plugin di server. Setelah ketemu Android Parcelable code generator, klik Install.
4. Biarkan Android Studio melakukan proses instalasi plugin. Bila sukses, maka Anda akan diminta untuk melakukan restartAndroid Studio yang sedang berjalan. 

Klik Restart → Klik OK dan jika ada pilihan untuk restart Android Studio maka pilih restart. Biarkan Android Studio untuk restart agar plugin-nya dapat kita gunakan setelahnya. Catatan : Jika dialog search tidak berhasil mencari plugin, kosongkan kata pencarian dan masukkan kembali kata pencarian "Android Parcelable". Ini bisa terjadi karena ada error di dalam dialog Plugins. 
5. Selanjutnya, setelah plugin Parcelable generator terinstal saatnya kita implementasikan pada kelas Person. Dengan cara : Klik kanan pada workspace (pastikan anda berada pada tab kelas Person) pilih menu Generate. 
6. Pilih Parcelable. 
7. Pada dialog box yang tampil, pilih semua variable yang ada lalu klik OK. Sekarang Anda bisa menemukan beragam metode parcelable untuk kelas Person. Sekarang kelas Person sudah sah menjadi kelas parcelable dan dapat dikirimkan ke activity lain melalui intent. 

8. Sekarang waktunya kita implementasikan pada intent. Namun sebelumnya tambahkan satu tombol lagi pada activity_main.xml sebagai berikut: 
1. <Button
2.    android:id="@+id/btn_move_activity_object"
3.    android:layout_width="match_parent"
4.    android:layout_height="wrap_content"
5.    android:text="Pindah Activity dengan Object"
6.    android:layout_marginBottom="@dimen/activity_vertical_margin"/> 

9. Setelah selesai dengan layout xml, sekarang kita tambahkan (pada bagian yang ditebalkan) juga di kelas MainActivity.javasehingga menjadi sebagai berikut :
1. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
2.    private Button btnMoveActivity;
3.    private Button btnMoveWithDataActivity;
4.    private Button btnMoveWithObject;
5.    @Override
6.    protected void onCreate(Bundle savedInstanceState) {
7.        super.onCreate(savedInstanceState);
8.        setContentView(R.layout.activity_main);
9.        btnMoveActivity = (Button)findViewById(R.id.btn_move_activity);
10.        btnMoveActivity.setOnClickListener(this);
11.        btnMoveWithDataActivity = (Button)findViewById(R.id.btn_move_activity_data);
12.        btnMoveWithDataActivity.setOnClickListener(this);
13.     
14.        btnMoveWithObject = (Button)findViewById(R.id.btn_move_activity_object);
15.        btnMoveWithObject.setOnClickListener(this);
16.    }
17.    @Override
18.    public void onClick(View v) {
19.        switch (v.getId()){
20.            case R.id.btn_move_activity:
21.                Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
22.                startActivity(moveIntent);
23.                break;
24.            case R.id.btn_move_activity_data:
25.                Intent moveWithDataIntent = new Intent(MainActivity.this, MoveWithDataActivity.class);
26.                moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAM E, "Esron RIkardo Nainggolan  ");
27.                moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
28.                startActivity(moveWithDataIntent);
29.                break;
30.       
31.            case R.id.btn_move_activity_object:
32.             
33.                break;
34.        }
35.    }
36. } 

10. Buat Activity baru dengan nama MoveWithObjectActivity lalu pada activity_move_with_object.xml tambahkan satu buah TextView untuk menampilkan data yang dikirimkan.

1. <?xml version="1.0" encoding="utf-8"?>
2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3.    xmlns:tools="http://schemas.android.com/tools"
4.    android:layout_width="match_parent"
5.    android:layout_height="match_parent"
6.    android:paddingBottom="@dimen/activity_vertical_margin"
7.    android:paddingLeft="@dimen/activity_horizontal_margin"
8.    android:paddingRight="@dimen/activity_horizontal_margin"
9.    android:paddingTop="@dimen/activity_vertical_margin"
10.    tools:context="id.ac.nusamandiri.belajarintentapp.MoveWithObjectActivity ">
11.    <TextView
12.        android:id="@+id/tv_object_received"
13.        android:layout_width="match_parent"
14.        android:layout_height="wrap_content"
15.        android:text="Object Received"/>
16. </RelativeLayout> 

11. Sekarang, pada MoveWithObjectActivity.java tambahkan kodenya sehingga menjadi sebagai berikut:
1. public class MoveWithObjectActivity extends AppCompatActivity {
2.    public static String EXTRA_PERSON = "extra_person";
3.    private TextView tvObject;
4.    @Override
5.    protected void onCreate(Bundle savedInstanceState) {
6.        super.onCreate(savedInstanceState);
7.        setContentView(R.layout.activity_move_with_object);
8.        tvObject = (TextView)findViewById(R.id.tv_object_received);
9.        Person mPerson = getIntent().getParcelableExtra(EXTRA_PERSON);
10.        String text = "Name : "+mPerson.getName()+", Email : "+mPerson.getEmail()+", Age : "+mPerson.getAge()
11.                + ", Location : "+mPerson.getCity();
12.        tvObject.setText(text);
13.    }
14. } 

12. Setelah kita membuat activity tujuan dengan sempurna, sekarang kita hanya butuh menambahkan beberapa baris pada bagian switch… case pada MainActivity.javasebagai berikut:
1. Person mPerson = new Person();
2. mPerson.setName("Muhammad Luthfi");
3. mPerson.setAge(23);
4. mPerson.setEmail(" muhammad.luthfi9@gmail.com");
5. mPerson.setCity("JAKARTA");
6. Intent moveWithObjectIntent = new Intent(MainActivity.this, MoveWithObjectActivity.class);
7. moveWithObjectIntent.putExtra(MoveWithObjectActivity.EXTRA_PERSON, mPerson);
8. startActivity(moveWithObjectIntent); 

Setelah semua komponen selesai dibuat, saatnya menjalankan kembali aplikasinya. Cobalah menakan tombol 'Pindah Activity dengan Object'. Sekarang Anda sudah berhasil memindahkan satu obyek secara utuh, Selamat!

Intent Dengan Tipe Implicit
Anda sudah belajar bagaimana menggunakan intent dengan tipe eksplisit. Sekarang saatnya Anda melanjutkan ke intent dengan tipe implicit.

1. Buka kembali activity_main.xml tambahkan satu tombol lagi sebagai berikut :

1. <Button
2.    android:id="@+id/btn_dial_number"
3.    android:layout_width="match_parent"
4.    android:layout_height="wrap_content"
5.    android:text="Dial a Number" 
6.    android:layout_marginBottom="@dimen/activity_vertical_margin"/> 

2. Sekarang, buka kembali MainActivity.java dan lanjutkan dengan melakukan casting tombol Dial Number, set listener dan menambahkan action ketika tombol diklik.

8. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
9.    private Button btnMoveActivity;
10.    private Button btnMoveWithDataActivity;
11.    private Button btnMoveWithObject;
12.    private Button btnDialPhone;
13.    @Override
14.    protected void onCreate(Bundle savedInstanceState) {
15.        super.onCreate(savedInstanceState);
16.        setContentView(R.layout.activity_main);
17.        btnMoveActivity = (Button)findViewById(R.id.btn_move_activity);
18.        btnMoveActivity.setOnClickListener(this);
19.        btnMoveWithDataActivity = (Button)findViewById(R.id.btn_move_activity_data);
20.        btnMoveWithDataActivity.setOnClickListener(this);
21.        btnMoveWithObject = (Button)findViewById(R.id.btn_move_activity_object);
22.        btnMoveWithObject.setOnClickListener(this);
23.        btnDialPhone = (Button)findViewById(R.id.btn_dial_number);
24.        btnDialPhone.setOnClickListener(this);
25.    }
26.    @Override
27.    public void onClick(View v) {
28.        switch (v.getId()){
29.            case R.id.btn_move_activity:
30.                Intent moveIntent = new Intent(MainActivity.this, MoveActivity.class);
31.                startActivity(moveIntent);
32.                break;
33.            case R.id.btn_move_activity_data:
34.                Intent moveWithDataIntent = new Intent(MainActivity.this, MoveWithDataActivity.class);
35.                moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME, "Muhammad Luthfi  ");
36.                moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 23);
37.                startActivity(moveWithDataIntent);
38.                break;
39.            case R.id.btn_move_activity_object:
40.                Person mPerson = new Person();
41.                mPerson.setName("Muhammad Luthfi");
42.                mPerson.setAge(23);
43.                mPerson.setEmail(" Muhammad.luthfi9@gmail.com");
44.                mPerson.setCity("JAKARTA");
45.                Intent moveWithObjectIntent = new Intent(MainActivity.this, MoveWithObjectActivity.class);
46.                moveWithObjectIntent.putExtra(MoveWithObjectActivity.EXTRA_PERSON, mPerson);
47.                startActivity(moveWithObjectIntent);
48.                break;
49.            case R.id.btn_dial_number:
50.                String phoneNumber = "085319094079";
51.                Intent dialPhoneIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+phoneNumber));
52.                startActivity(dialPhoneIntent);
53.                break;
54.        }
55.    } }

Setelah selesai, silakan jalankan lagi aplikasi.dan aplikasi yang digunakan bisa men-dial sebuah nomor telepon melalui aplikasi bawaan dari peranti yang dibuat.



Selanjutnya, kita akan membuat sebuah Intent yang didalamnya akan membawa data dengan ResultActivity.

Pada modul ini, kita akan membedah hubungan activity dan intent dalam menerima nilai balik. Kadang kala, ketika kita menjalankan sebuah activity dari activity lain, kita mengharapkan ada nilai hasil balik dari activity yang dijalankan ketika ia ditutup.

Contohnya kita memiliki activity A yang menjalankan activity B untuk melakukan sebuah proses. Lalu nilai hasil dari proses tersebut dikirimkan kembali ke activity A sebelum activity B ditutup dengan pemanggilan metode finish(). Itulah yang dinamakan sebuah activity menerima nilai hasil balik dari activity yang dia jalankan. Untuk memperjelas, ayo kita lanjutkan lagi proses ngodingnya.

1. Sekarang untuk menerapkan konsep diatas, buat sebuah activity baru dengan nama MoveForResultActivity. Setelah itu, pada activity_result.xml silakan kondisikan layout kita dengan 1 buah TextView, 1 buah Radio Group, 3 buah Radio Button  dan 2 buah Button sebagai berikut :



2. Setelah selesai, lanjutkan ke berkas MoveForResultActivity.java dengan menuliskan kode sebagai berikut :


3. Pada activity_main.xml tambahkan lagi satu Button dan satu TextView yang akan kita gunakan untuk menjalankan MoveForResultActivity sebagai berikut:
1. <Button
2.    android:id="@+id/btn_move_for_result"
3.    android:layout_width="match_parent"
4.    android:layout_height="wrap_content"
5.    android:text="Pindah Activity untuk Result"
6.    android:layout_marginBottom="@dimen/activity_vertical_margin"/>
7. <TextView
8.        android:id="@+id/tv_result"
9.        android:layout_width="match_parent"
10.        android:layout_height="wrap_content"
11.        android:textSize="24sp"
12.        android:gravity="center"
13.        android:text="Hasil"/>

4. Setelah selesai, kita lanjut garap berkas MainActivity.java. Buka berkasnya dan sesuaikan kodenya sebagai berikut.


5. Setelah selesai, pastikan tidak ada bagian kode yang tertinggal. Jalankan kembali aplikasinya, dan coba Anda pilih tombol ‘Pindah Activity untuk Result’. Pilih angka yang Anda suka dan lihat hasilnya. Di MainActivity.java sudah ada angka yang tadi Anda pilih di obyek textiew tvResult. 

 

Sekian percobaan pembuatan aplikasi yang saya buat pada pertemuan 5 semoga bermanfaat 😇🙏