Anda di halaman 1dari 8

Soal UAS – Pemrograman Mobile

Dosen : Romi Fadillah Rahmat, B.Comp.Sc., M.Sc.


Waktu Ujian : 90 menit

1. Uraikan anatomi notifikasi!


2. Firebase merupakan layanan dari google yang memudahkan developer dalam mengembangkan
aplikasi. Salah satu fitur yang disediakan adalah cloud messaging.
a) Sebutkan dan jelaskan jenis-jenis pesan di fitur cloud messaging!
b) Berikan perbedaan setiap jenis pesan saat aplikasi berada di foreground dan background!
c) Buatlah contoh json dari setiap jenis pesan!
3. Sebutkan keunggulan-keunggulan SQLite dan buatlah contoh saat kapan sebuah aplikasi sebaiknya
menggunakan SQLite!
4. Buatlah sebuah notifikasi menggunakan bahasa pemrograman java. Jika notifikasi ditekan maka
akan membuka DetailActivity, sedangkan action button menjalankan ReplyBroadcastReceiver dan
ArchiveBroadcastReceiver.(Anggap broadcastreceiver dan DetailActivity sudah ada sehingga tidak
perlu di-coding. Adapun tampilan notifikasi seperti berkiut.

5. Apa perbedaan Statelesswidget dan StatefulWidget ? Dan berikan contoh kasus penggunaannya!
6. Sebutkan dan jelaskan 5 widget flutter yang Anda ketahui!
7. Anda diberikan tiga endpoint:
https://usu.ac.id/getmhs/[nim] untuk mendapatkan data mahasiswa,
https://usu.ac.id/getbiomhs/[nim] untuk mendapatkan biodata mahasiswa, dan
https://usu.ac.id/krs/[krs_id] untuk mendapatkan ID mata kuliah yang diambil mahasiswa. Krs_id
didapatkan dari endpoint mahasiswa

Buatlah fungsi menggunakan bahasa pemrograman dart / framework flutter untuk mendapatkan
ketiga data tersebut dengan memanfaatkan asyncronous programming di dart sehingga waktu yang
dibutuhkan untuk mendapatkan data lebih efektif. (tidak perlu sampai menampilkan UI/membubat
widget, parameter nim menggunakan nim Anda).
1.

Ikon kecil: Wajib diisi dan disetel dengan setSmallIcon().


Nama aplikasi: Disediakan oleh sistem.
Stempel waktu: Ini diberikan oleh sistem, tetapi Anda dapat
menggantinya dengan setWhen() atau menyembunyikannya dengan
setShowWhen(false).
Ikon besar: Ini opsional (biasanya hanya digunakan untuk foto
kontak; jangan gunakan untuk ikon aplikasi Anda) dan disetel
dengan setLargeIcon().
Judul: Ini opsional dan disetel dengan setContentTitle().
Teks: Ini opsional dan disetel dengan setContentText().
2. a. - Pesan Notifikasi : Pesan tampilan, Firebase Cloud Messaging
secara otomatis menampilkan pesan ke perangkat pengguna akhir
atas nama aplikasi klien
- Pesan Data : memuat key-value pair kustom buatan pengguna.
- Opsi pengiriman pesan : opsi pengiriman khusus untuk pesan
yang dikirim ke perangkat Android, dan memungkinkan opsi
serupa di iOS dan web.
- Pesan yang tidak dapat diperkecil : setiap pesan dikirimkan ke
perangkat,  setiap pesan penting bagi aplikasi klien dan harus
dikirimkan. 
- Pesan yang dapat diperkecil : pesan yang dapat diganti dengan
pesan baru jika pesan tersebut belum dikirimkan ke perangkat,
memberi tahu aplikasi seluler untuk menyinkronkan data dari
server karena hanya pesan terbaru yang dianggap relevan.
b. – foreground : tampilan paling depan yang dilihat oleh user pada
saat menggunakan.
- background : tampilan yang sedang disimpan untuk dimunculkan
pada saat user men-trigger event yang akan memunculkan activity

c.
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDM
ExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
},
"data" : {
"Nick" : "Mario",
"Room" : "PortugalVSDenmark"
}
}
}
3. - Mudah dikelola sebab SQLite merupakan file tunggal dan tidak
menggunakan konfigurasi yang banyak
- Sangat Stabil dengan software engineer yang handal, banyak
fitur yang telah ditambahkan.
- SQLite sangat cepat jika berjalan pada lingkup yang sama
sehingga tidak ada sumber daya tambahan seperti jaringan ketika
menjalankan query maupun mengambil data.

4. MainActivity.java
8. package com.example.belajarnotification;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;

public class MainActivity extends AppCompatActivity {

Button btnTrigger;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnTrigger = findViewById(R.id.btn_trigger);

creatNotificationChannel();
handleOnClickButton();
}

void handleOnClickButton() {
btnTrigger.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
triggerNotification();
}
});
}

void creatNotificationChannel(){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
CharSequence channelName
=getString(R.string.channelTestName);
String channelDescription
=getString(R.string.channelTestDesc);
String channelid =getString(R.string.channelTestId);
int importance = NotificationManager.IMPORTANCE_DEFAULT;

NotificationChannel notificationChannel = new


NotificationChannel(channelid, channelName, importance);
notificationChannel.setDescription(channelDescription);

NotificationManager notificationManager =
getSystemService(NotificationManager.class);

notificationManager.createNotificationChannel(notificationChannel);

}
}
void triggerNotification() {
Intent intent = new Intent(this,
DetailDetailActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK);
// PendingIntent pendingIntent =
PendingIntent.getActivity(this,0, intent,0);

TaskStackBuilder stackBuilder =
TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(intent);
PendingIntent pendingIntent =
stackBuilder.getPendingIntent(0, FLAG_UPDATE_CURRENT);
Intent actionIntent = new Intent(this,
NotificationBroadcastReceiver.class);
actionIntent.putExtra("msg","Broadcastreceiver berhasil
dijalankan");
actionIntent.setAction("ACTION_TEST_NOTIFICATION");
PendingIntent actionPendingIntent =
PendingIntent.getBroadcast(this,0, actionIntent,0);

NotificationCompat.Builder builder = new


NotificationCompat.Builder(this, getString(R.string.channelTestId))
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentTitle("Test Notification")
.setContentText("Test Notification text...")
.setStyle(new
NotificationCompat.BigTextStyle().bigText("Text Notification text
yang panjang dengan teks yang panjang yang dapat dilihat
keseluruhannya"))
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.addAction(R.drawable.ic_launcher_foreground,"TEST",
actionPendingIntent)
.setAutoCancel(true);

NotificationManagerCompat notificationManagerCompat =
NotificationManagerCompat.from(this);

notificationManagerCompat.notify(getResources().getInteger(R.integer
.notificationTestid), builder.build());
}
}

NotificationBroadcastReceiver.java

package com.example.belajarnotification;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class NotificationBroadcastReceiver extends BroadcastReceiver {

final String TAG = "NotificationBroadcastReceiver";

@Override
public void onReceive(Context context, Intent intent) {
String massage = intent.getStringExtra("msg");
Log.d(TAG, massage);
}
}
5. Stateless Widget : Widget yang tidak dapat dirubah bersifat
immutable atau tidak akan pernah berubah contoh kasus
penggunaannya saat membuat suatu komponen yang sederhana
dan bersifat statis. Sedangkan Stateful Widget : Widget yang
dapat berubah atau mutable contoh kasus penggunaannya saat
membuat suatu komponen yang sederhana dan bersifat statis.
6. Widget flutter
- Text : Dapat membuat text Panjang atau 1 baris tergantung
constrain layout, kemudian dapat memanipulasi jenis font,
ukuran, warna, jenis font dan lainnya.
- TextSpan : Rentang teks yang tidak dapat diubah, memiliki style
property untuk memberi style pada teks dan memiliki children
property untuk menambahkan lebih banyak teks ke widget serta
memberi style pada widget.
- RichText : digunakan untuk menampilkan teks yang
menggunakan berbagai style yang berbeda.
- Padding : untuk membuat ataupun memposisikan widget child
yang dimiliki dengan memberikan jarak.
- Container : hanya dapat memiliki satu buah child widget saja
namun, dapat menempatkan row, column, text ataupun container
lainnya.
- Row : Widget yang digunakan dalam menempatkan widget-
widget lain secara horizontal.
- Column : Widget yang digunakan dalam menempatkan widget-
widget lain secara vertikal.
- Flexible : Widget yang digunakan membuat tampilan dengan
ukuran dalam perbandingan tertentu, sehingga mudah diatur
serta bersifat fleksibel.
- Expanded : Widget memperluas child dari Row, Column atau
flex sehingga mengisi ruang yang tersedia pada sumbu utama.
- Scaffold : Widget yang utama dalam membangun halaman pada
flutter yang memiliki beberapa parameter seperti; appBar untuk
membuat AppBar, body untuk bagian tubuhnya atau isinya ,
menambahkan floating action bar, maupun mengganti warna
pada background body.
- TextField : untuk memasukkan suatu text yang biasanya terdapat
pada login terdapat input username ataupun password.
- Elevated Button : memberikan dimensi yang menunjukan suatu
aksi pada saat tombol ditekan
- TextButton : Text yang terdapat pada tombol yang biasanya
sebagai penjelasan fungsi daripada tombol tersebut.
- ListView : Widget list yang disusun secara bergulir dan dapat di
scroll.
- GesturDetector : Widget yang dapat mendeteksi Gerakan,
misalnya saat adanya aksi double tap.
- IconButton : Icon yang terdapat pada tombol sebagai penjelas
fungsi tombol dalam bentuk icon.
- AssetsImages : Mengambil gambar dari AssetBundle, setelah
menentukan gambar yang tepat untuk digunakan berdasarkan
konteks.
- NetworkImage : Mengambil URL yang diberikan dari jaringan,
dan mengaitkannya dengan skala yang telah diberikan.
7.
import 'dart:io';

main() {
stdout.write("Nama : , Nim: ");
var nama = stdin.readLineSync();
print("Hello $nama!");
}

Anda mungkin juga menyukai