Modul Pemrograman Mobile BAB IV 2021
Modul Pemrograman Mobile BAB IV 2021
BAB IV
ACTIVITY
Activity (aktivitas) menyatakan layar tunggal di aplikasi Anda dengan antarmuka yang
bisa digunakan pengguna untuk berinteraksi. Misalnya, pada smartphone anda terdapat sebuah
aplikasi email. Aplikasi email tersebut mungkin memiliki beberapa aktivitas diantaranya sebuah
aktivitas yang menampilkan daftar email baru, aktivitas untuk menulis email, dan aktivitas lainnya
lagi untuk membaca pesan satu per satu. Pada dasarnya, aplikasi Anda adalah koleksi aktivitas
yang dibuat sendiri atau yang digunakan kembali dari aplikasi lain.
Meskipun aktivitas di aplikasi Anda bekerja sama satu sama lain untuk membentuk user
experience yang kohesif, setiap aktivitas tidak tergantung pada yang lain. Ini memungkinkan
aplikasi Anda untuk memulai aktivitas di aplikasi lain, dan itu memungkinkan aplikasi lain untuk
memulai aktivitas di aplikasi Anda (jika aplikasi Anda memungkinkan ini). Misalnya, aplikasi olah
pesan dapat memulai aktivitas dalam aplikasi kamera untuk mengambil gambar, kemudian
memulai aktivitas dalam aplikasi email untuk memungkinkan pengguna berbagi gambar dalam
email.
1
Biasanya, satu Aktivitas dalam aplikasi ditentukan sebagai aktivitas "utama", misalnya
MainActivity. Pengguna akan melihat aktivitas utama ketika mereka meluncurkan aplikasi untuk
pertama kalinya. Setiap aktivitas dapat memulai aktivitas lain untuk melakukan aksi yang berbeda.
Setiap kali aktivitas baru dimulai, aktivitas sebelumnya dihentikan, tetapi sistem
mempertahankan aktivitas dalam tumpukan ("back stack"). Ketika pengguna selesai dengan
aktivitas saat ini dan menekan tombol Kembali, aktivitas tersebut muncul dari tumpukan dan
dihancurkan, dan aktivitas sebelumnya dilanjutkan.
Ketika suatu aktivitas dihentikan karena aktivitas baru dimulai, aktivitas pertama akan
diberitahu melalui metode panggilan balik siklus aktivitas. Siklus hidup aktivitas adalah
sekumpulan status yang dapat diikuti oleh Aktivitas: saat aktivitas pertama kali dibuat, saat
dihentikan atau dilanjutkan, dan saat sistem menghancurkannya.
2. Buka res/layout/activity_main.xml.
3. Konversi layout ke relative layout dan tambahkan padding 15dp
pada semua sisi layout.
# Membuat layout untuk aktivitas utama
Setiap aktivitas baru yang Anda tambahkan ke proyek Anda memiliki layout XML dan file
Java sendiri, terpisah dari aktivitas utama. Mereka juga memiliki elemen <activity> mereka sendiri
dalam Android manifest. Seperti halnya aktivitas utama, aktivitas baru yang Anda buat di Android
Studio juga diperluas (extend) dari AppCompatActivity class.
Semua aktivitas di aplikasi Anda hanya terhubung secara fleksibel satu sama lain. Namun,
Anda dapat menetapkan suatu aktivitas sebagai induk dari aktivitas lain dalam file
AndroidManifest.xml. Hubungan parent-child ini memungkinkan Android untuk menambahkan
petunjuk navigasi seperti panah yang menghadap ke kiri di bilah judul untuk setiap aktivitas.
Aktivitas berkomunikasi satu sama lain (baik di aplikasi yang sama dan di aplikasi yang
berbeda) dengan Intent. Ada dua jenis Intent, eksplisit dan implisit. Intent eksplisit adalah tujuan di
mana target Intent itu diketahui, yaitu, Anda sudah tahu nama kelas yang sepenuhnya memenuhi
syarat untuk aktivitas spesifik itu. Intent implisit adalah Intent di mana Anda tidak memiliki nama
komponen target, tetapi memiliki tindakan umum untuk dilakukan.
Dalam praktikum ini Anda akan menambahkan aktivitas kedua ke aplikasi, dengan
layoutnya sendiri. Anda akan memodifikasi Android manifest untuk menetapkan aktivitas utama
sebagai induk dari aktivitas kedua. Kemudian Anda akan memodifikasi onClick event method di
aktivitas utama untuk memasukkan Intent yang meluncurkan aktivitas kedua ketika Anda mengklik
button.
1. Klik folder aplikasi untuk proyek Anda dan pilih File > New >
Activity > Empty Activity.
2. Beri nama aktivitas baru "AktivitasKedua" Pastikan Generate
Layout File dicentang, dan nama layout akan diisi dengan
“aktivitas_kedua”.
3. Klik Finish. Android Studio akan menambahkan layout aktivitas
baru (aktivitas_kedua) dan file Java baru (AktivitasKedua) ke
proyek Anda untuk aktivitas baru. Ini juga memperbarui
manifest Android untuk memasukkan aktivitas baru.
<activity android:name=".AktivitasKedua"></activity>
startActivity(Intent);
Pada prkatikum sebelumnya, Anda menambahkan Intent eksplisit ke aktivitas utama yang
mengaktifkan aktivitas kedua. Anda juga dapat menggunakan Intent untuk mengirim data dari satu
aktivitas ke aktivitas lainnya.
Dalam tugas ini, Anda akan memodifikasi Intent eksplisit dalam aktivitas utama untuk
memasukkan data tambahan (dalam hal ini, string yang dimasukkan pengguna) dalam ekstra Intent.
Anda kemudian akan memodifikasi aktivitas kedua untuk mendapatkan kembali data dari ekstra
Intent dan menampilkannya di layar.
1. Buka res/layout/activity_main.xml.
2. Tambahkan tampilan EditText (Teks Biasa di Editor Layout.)
Berikan EditText atribut ini:
No Nama atribut Nilai
1 android:id "@+id/editText_main"
2 android:layout_width match_parent
3 android:layout_height wrap_content
4 android:layout_toLeftOf "@+id/button_main"
5 android:layout_toStartOf "@+id/button_main"
6 android:layout_alignParentBottom "true"
7 android:hint "Masukkan pesan anda di
sini!"
mMessageEditText=(EditText)
findViewById(R.id.editText_main);
Intent.putExtra(EXTRA_MESSAGE, message);
TextView TextView =
(TextView)findViewById(R.id.text_message);
TextView.setText(message);
Sekarang Anda memiliki aplikasi yang meluncurkan aktivitas baru dan mengirimkan data
ke sana, langkah terakhir adalah mengembalikan data dari aktivitas kedua kembali ke aktivitas
utama. Anda juga akan menggunakan Intent dan ekstra Intent untuk tugas ini.
2 android:layout_toLeftOf= android:layout_toLeftOf=
"@+id/button_main" "@+id/button_second"
3 android:layout_toStartOf= android:layout_toStartOf=
"@+id/button_main" "@+id/button_kedua"
4 android:hint= android:hint=
"@string/editText_main" "@string/editText_kedua"
<string name="button_kedua">Balas</string>
<string name="editText_kedua"> Masukkan pesan balasan di
sini!
</string>
5. Buka AktivitasKedua.java
6. Di bagian atas kelas, tambahkan konstanta publik untuk
mendefinisikan kunci untuk Intent ekstra:
setResult(RESULT_OK,replyIntent);
finish();
13. Salin dua TextView untuk tampilan pesan dari file layout
aktivitas kedua dan tempelkan ke layout utama di atas
EditText dan Button view yang ada.
14. Ubah nilai atribut untuk kedua TextView baru ini. Gunakan
nilai-nilai ini:
No Atribut Header TextView Atribut Header TextView(baru)
(lama)
1 android:id="@+id/text_header" android:id="@+id/text_header_reply"
2 android:text= android:text=
"@string/text_header" "@string/text_header_reply"
android:visibility="invisible"
mReplyHeadTextView = (TextView)
findViewById(R.id.text_header_reply);
mReplyTextView = (TextView)
findViewById(R.id.text_message_reply);
21. Dalam metode luncurkanAktivitaskedua(), ubah panggilan
untuk startActivity() menjadi startActivityForResult(), dan
sertakan kunci TEXT_REQUEST sebagai argumen:
startActivityForResult(Intent, TEXT_REQUEST);
if (requestCode == TEXT_REQUEST) {
if (resultCode == RESULT_OK) {
}
}
String reply =
data.getStringExtra(SecondActivity.EXTRA_REPLY);
mReplyHeadTextView.setVisibility(View.VISIBLE);
27. Tetapkan teks tampilan teks balasan ke balasan, dan
tetapkan visibilitasnya menjadi true:
mReplyTextView.setText(reply);
mReplyTextView.setVisibility(View.VISIBLE);
Jawaban:
…………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
……………………………………………………………………….………………………………………………………
…………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
……………….………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
………………………………………………………………………………………….……………………………………
…………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
………………………………………………………..………………………………….
Latihan 4.2.
1. Buat aplikasi dengan tiga tombol berlabel: Teks Satu, Teks
Dua, dan Teks Tiga. Ketika salah satu dari tombol itu diklik,
maka aktivitas kedua diluncurkan. Aktivitas kedua tersebut
harus berisi ScrollView yang menampilkan salah satu dari tiga
kalimat teks (teks yang ditampilkan berbeda, tergantung pada
tombol yang ditekan). Gunakan Intent untuk meluncurkan
aktivitas kedua dan ekstra intent untuk menunjukkan yang mana
dari ketiga kalimat yang akan ditampilkan.
Jawaban:
Screenshot layer smartphone pengiriman pesan dari aktivitas
utama ke aktivitas kedua (button 1).
Jawaban:
Screenshot layer smartphone pengiriman pesan dari aktivitas
utama ke aktivitas kedua (button 1).
Setiap tahap dalam siklus hidup suatu kegiatan memiliki metode callback yang sesuai
(onCreate (), onStart (), onPause (), dan sebagainya). Ketika suatu aktivitas berubah status, metode
callback terkait dipanggil. Pada program sebelumnya yang telah dikerjakan, Anda telah melihat
salah satu metode ini: onCreate (). Dengan menimpa salah satu metode callback siklus hidup di
kelas aktivitas Anda, Anda dapat mengubah perilaku default bagaimana perilaku aktivitas Anda
dalam menanggapi pengguna atau sistem dengan aksi berbeda.
Perubahan pada status aktivitas juga dapat terjadi sebagai respons terhadap perubahan
konfigurasi perangkat seperti memutar perangkat dari potret ke lanskap. Perubahan konfigurasi ini
menghasilkan aktivitas yang dihancurkan dan seluruhnya diciptakan kembali dalam keadaan
default, yang dapat menyebabkan hilangnya informasi yang dimasukkan pengguna dalam aktivitas
itu. Sangat penting untuk mengembangkan aplikasi Anda untuk mencegah hal ini untuk
menghindari kebingungan pengguna. Selanjutnya dalam praktik ini kita akan bereksperimen
dengan perubahan konfigurasi dan mempelajari cara mempertahankan status aktivitas Anda
sebagai respons terhadap perubahan konfigurasi perangkat atau peristiwa siklus hidup Aktivitas
lainnya.
Dalam praktik ini, Anda akan menambahkan pernyataan logging ke aplikasi DuaAktivitas
yang telah dikerjakan sebelumnya pada bagian A dan mengamati perubahan siklus hidup saat Anda
menggunakan aplikasi dengan berbagai cara.
Anda kemudian akan mulai bekerja dengan perubahan ini dan menjelajahi cara menangani
input pengguna dalam kondisi ini.
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG,"--------Saat ini dalam fase:------");
Log.d(LOG_TAG,"onStart");
}
…………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
……………………………………………………………………….………………………………………………………
…………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
……………….………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
………………………………………………………………………………………….……………………………………
…………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
………………………………………………………..………………………………….……………………………………
…………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
………………………………….……………………………………………………………………………………………
…………………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………….…………………
…………………………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………………
………………………………………………………………………………….…………………………………………
……………………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………………
……………………………………….……………………………………………………………………………………
……………………………………………………………………………………………………………………………
………………………………………………………………………………………………………………………….…
……………………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………………
……………………………………………………………………………………………………..……………………
…………….………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………………
……………………………………………………………………………………………….……………………………
……………………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………………
…………………………………………………….………………………………………………………………………
Fase apa saja yang terjadi pada saat anda menggunakan tombol
back untuk kembali dari aktivitas kedua ke aktivitas utama
Fase apa saja yang terjadi pada saat anda menggunakan panah
kembali pada Action Bar untuk kembali dari aktivitas kedua ke
aktivitas utama
Fase apa saja yang terjadi pada saat anda merotasi perangkat
anda pada kedua aktifitas
Fase apa saja yang terjadi pada saat anda menekan tombol
overview (tombol yang berda di dekat tombol home) dan tombol
keluar dari aplikasi
Aktivitas Utama Aktivitas Kedua
□ onCreate() □ onStart() □ onCreate() □ onStart()
□ onPause() □ onStop() □ onPause() □ onStop()
□ onRestart() □ onResume() □ onRestart() □ onResume()
□ onDestroy() □ □ onDestroy()
Fase apa saja yang terjadi pada saat anda kembali ke home
screen perangkat anda lalu kembali masuk ke aplikasi
Bergantung pada sumber daya sistem dan perilaku pengguna, aktivitas di aplikasi Anda
mungkin dihancurkan dan direkonstruksi jauh lebih sering daripada yang Anda bayangkan. Anda
mungkin telah memperhatikan serangkaian aktivitas ini di bagian terakhir ketika Anda memutar
perangkat atau emulator. Memutar perangkat adalah salah satu contoh perubahan konfigurasi
perangkat. Meskipun rotasi adalah yang paling umum, semua perubahan konfigurasi
mengakibatkan aktivitas saat ini dihancurkan dan diciptakan kembali seolah-olah itu baru. Jika
Anda tidak memperhitungkan perilaku ini dalam kode Anda, ketika perubahan konfigurasi terjadi,
tata letak aktivitas Anda dapat kembali ke tampilan default dan nilai awal, dan pengguna Anda
mungkin kehilangan tempat, data mereka, atau keadaan kemajuan mereka dalam aplikasi Anda.
Keadaan masing-masing aktivitas disimpan sebagai satu set pasangan kunci / nilai dalam
objek Bundel yang disebut activity instance state. Sistem menyimpan informasi status default ke
bundel keadaan instance tepat sebelum aktivitas dihentikan, dan meneruskan bundel itu ke instance
aktivitas baru untuk dipulihkan.
Agar tidak kehilangan data dalam aktivitas Anda saat dihancurkan dan dibuat ulang secara
tak terduga, Anda perlu menerapkan metode onSaveInstanceState (). Sistem memanggil metode ini
pada aktivitas Anda (antara onPause () dan onStop ()) ketika ada kemungkinan aktivitas tersebut
dapat dihancurkan dan diciptakan kembali.
Data yang Anda simpan dalam keadaan instance hanya spesifik untuk instance aktivitas
khusus ini selama sesi aplikasi saat ini. Saat Anda berhenti dan memulai kembali sesi aplikasi baru,
status instance aktivitas hilang dan aktivitas Anda akan kembali ke tampilan defaultnya. Jika Anda
perlu menyimpan data pengguna di antara sesi aplikasi, gunakan preferensi bersama atau database.
Anda mungkin telah memperhatikan bahwa memutar perangkat tidak mempengaruhi
kondisi aktivitas kedua sama sekali. Ini karena tata letak dan status aktivitas kedua dihasilkan dari
tata letak dan intent yang mengaktifkannya. Bahkan jika aktivitas diciptakan kembali, intent masih
ada dan data dalam intent itu masih digunakan setiap kali fase onCreate () aktivitas kedua
dipanggil.
Selain itu, Anda mungkin memperhatikan bahwa dalam kedua aktivitas tersebut, teks apa
pun yang Anda ketikkan ke dalam pesan atau balas EditTeks tetap dipertahankan meskipun
perangkat diputar. Ini karena informasi keadaan beberapa tampilan dalam tata letak Anda secara
otomatis disimpan di seluruh perubahan konfigurasi, dan nilai EditText saat ini adalah salah satu
dari kasus tersebut.
Satu-satunya status aktivitas yang Anda mungkin perlu perhatikan dengan baik adalah
TextViews untuk header balasan dan teks balasan di aktivitas utama. Kedua TextViews tidak
terlihat secara default; mereka hanya muncul setelah Anda mengirim pesan kembali ke aktivitas
utama dari aktivitas kedua. Saat anda merotasi perangkat anda, data yang ditampilkan hilang.
Dalam praktikum berikut ini Anda akan menambahkan kode untuk mempertahankan keadaan
instance dari dua TextViews ini menggunakan onSaveInstanceState ().
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
outState.putString("reply_text",mReplyTextView.getText().toS
tring());
Setelah Anda menyimpan keadaan instance aktivitas, Anda juga harus mengembalikannya
saat aktivitas dibuat ulang. Anda bisa melakukan ini di onCreate(), atau dengan
mengimplementasikan callbak onRestoreInstanceState(), yang dipanggil setelah onStart() setelah
aktivitas dibuat. Akan lebih baik untuk memulihkan status aktivitas di onCreate(), untuk
memastikan bahwa antarmuka pengguna Anda termasuk keadaan tersedia sesegera mungkin.
Kadang-kadang nyaman untuk melakukannya di onRestoreInstanceState () setelah semua
inisialisasi telah dilakukan, atau untuk memungkinkan subkelas untuk memutuskan apakah akan
menggunakan implementasi default Anda.
if(savedInstanceState!=null){
}
if(savedInstanceState!=null){
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
if (isVisible){
}
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(savedInstanceState.getString("reply_t
ext"));
<string
name="edittext_uri">http://developer.android.com</string>
<string name="button_uri">Open Website</string>
tools:context="co
android:orientati
mWebsiteEditText = (EditText)
findViewById(R.id.website_edittext);
if (intent.resolveActivity(getPackageManager()) != null) {
}
startActivity(intent);
10. Tambahkan blok lain untuk mencetak pesan log jika intentnya
tidak dapat diselesaikan.
else {
Log.d("ImplicitIntents", "Can't handle this!");
}
mLocationEditText = (EditText)
findViewById(R.id.location_edittext);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Log.d("ImplicitIntents", "Can't handle this intent!");
}
mShareTextEditText = (EditText)
findViewById(R.id.share_edittext);
ShareCompat.IntentBuilder
.from(this)
.setType(mimeType)
.setChooserTitle("Share this text with: ")
.setText(txt)
.startChooser();
No Metode Deskripsi
1 from() Aktivitas yang melucurkan intent share saat ini
(this).
2 setType() Tipe MIME dari item yang akan dishare.
3 setChooserTitle() Judul yang muncul pada system pemilihan app.
4 setText() Text actual yang akan dishare.
5 startChooser() Menampilkan system pemilihan app dan mengirimkan
intent.
ShareCompat.IntentBuilder
.from(this)
.setType(mimeType)
.setChooserTitle("Share this text with: ")
.setText(txt)
.startChooser();
}
Tempel screenshot
tampilan setelah
mengklik tombol
Sejauh ini, Anda telah membuat aplikasi yang menggunakan intent eksplisit dan implisit
untuk meluncurkan beberapa aktivitas aplikasi lain. Dalam praktikum berikut ini kita akan melihat
masalah dari sebaliknya: memungkinkan aktivitas di aplikasi Anda untuk menanggapi intent
implisit yang dikirim dari beberapa aplikasi lain.
Aktivitas di aplikasi Anda selalu dapat diaktifkan dari dalam atau di luar aplikasi Anda
dengan intent eksplisit. Untuk mengizinkan suatu kegiatan menerima intent implisit, Anda
menetapkan filter intent dalam manifes Anda untuk menunjukkan intent implisit mana yang
tertarik untuk ditangani oleh aktivitas Anda.
Untuk mencocokkan permintaan Anda dengan aplikasi spesifik yang diinstal pada
perangkat, sistem Android mencocokkan intent implisit Anda dengan aktivitas yang filter intentnya
menunjukkan bahwa mereka dapat melakukan tindakan itu.
Jika ada beberapa aplikasi yang diinstal yang cocok, pengguna disajikan dengan pemilih
aplikasi yang memungkinkan mereka memilih aplikasi mana yang ingin mereka gunakan untuk
menangani intent itu.
Ketika sebuah aplikasi pada perangkat mengirimkan intent implisit, sistem Android
mencocokkan tindakan dan data intent itu dengan aktivitas yang tersedia yang menyertakan filter
intent yang benar. Jika filter intent aktivitas Anda cocok dengan intent, aktivitas Anda dapat
menangani intent itu sendiri (jika itu satu-satunya aktivitas yang cocok), atau (jika ada beberapa
yang cocok) pemilih aplikasi muncul untuk memungkinkan pengguna untuk memilih aplikasi
mana yang mereka inginkan.
Dalam praktikum berikut ini Anda akan membuat aplikasi yang sangat sederhana yang
menerima intent implisit untuk membuka URI untuk halaman web.
Saat diaktifkan oleh intent tersirat, aplikasi itu menampilkan URI yang diminta sebagai
string di TextView.
No Attribut Value
1 android:id "@+id/text_uri_message"
2 android:layout_width wrap_content
3 android:layout_height wrap_content
4 android:textSize "18sp"
5 android:textStyle "bold"
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
<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>
<intent-filter>
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"
android:host="developer.android.com" />
</intent-filter>
</activity>
</application>
Dalam metode onCreate () untuk aktivitas Anda, Anda memproses intent yang masuk
untuk setiap data atau tambahan yang disertakan. Dalam hal ini, maksud tersirat masuk memiliki
URI disimpan dalam data Intent.
if (uri != null) {
String uri_string = "URI: " + uri.toString();
}
textView.setText(uri_string);
9. Tekan tombol back, dan masukkan URI yang lain, lalu klik open
website
Aplikasi penerima memiliki filter intent sangat terbatas yang
hanya cocok dengan protokol URI (http) dan host
(developer.android.com). URI lain terbuka di browser web
default.
Tempel screenshot
tampilan setelah
mengklik tombol