PERTEMUAN KE – 7 Broadcast Receiver dan Services A. TUJUAN Mahasiswa diharapkan dapat memahami dan mengetahui tentang Broadcast Receviver dan Service serta bagaimana menggunakannya. B.
TEORI SINGKAT
BROADCAST RECEIVER Broadcast Receiver adalah respon ke pesan broadcast dari aplikasi lain atau dari sistem itu sendiri. Pesan ini kadang-kadang disebut event atau intent. Sebagai contoh, aplikasi dapat juga menginisiasi broadcast untuk membiarkan aplikasi lain tahu bahwa beberapa data telah didownload ke device dan ada untuk digunakan, jadi ini adalah broadcast receiver yang akan menangkap komunikasi dan akan memulai aksi yang tepat. Berikut adalah 2 langkah penting untuk membuat BroadcastReceiver bekerja •
menciptakan the Broadcast Receiver.
•
Me-Register Broadcast Receiver
Menciptakan broadcast receiver Sebuah broadcast receiver diimplementasikan sebagai subclass dari kelas BroadcastReceiver dan mengoveride method onReceive() dimana setiap pesan yang diterima sebagai parameter obyek dari Intent. public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); } } Meregister BroadcastReceiver Sebuah aplikasi mendengarkan broadcast intent secara spesifik dengan meregister sebuah broadcast receiver dalam file AndroidManifest.xml.
Berikut beberapa konstanta Event yang dapat digunakan. Event Constant Keterangan android.intent.action.BATTERY_CHANGED Broadcast yang terdiri dari keadaan charging, level, dan informasi lain tentang batery. android.intent.action.BATTERY_LOW Mengindikasikan kondisi batery device lemah android.intent.action.BATTERY_OKAY Mengindikasikan batery sudah okay sesudah lemah. android.intent.action.BOOT_COMPLETED Ini sekali broadcast, sesudah sistem selesai booting. android.intent.action.BUG_REPORT Memperlihatkan activity melakukan report bug. android.intent.action.CALL Menyajikan panggilan ke nomer spesifik. android.intent.action.CALL_BUTTON User menekan button "call" untuk menuju ke pemanggilan telepon. android.intent.action.DATE_CHANGED Tanggal diubah. android.intent.action.REBOOT Device reboot. SERVICE Service adalah komponen aplikasi yang merepresentasikan sebuah keiningan aplikasi untuk melakukan operasi running yang lebih panjang pada saat tidak berinteraksi dengan user atau untuk memasok fungsionalitas aplikasi lain untuk digunakan. Masing-masing service class harus mempunyai deklarasi <service> yang berhubungan di dalam paket AndroidManifest.xml. Service bisa dimulai dengan Context.startService() dan Context. bindService(). Class IntentService bisa diperoleh sebagai sebuah implementasi standar yang mempunyai alurnya sendiri dimana dia menjadualkan pekerjaannya untuk diselesaikan. Apa itu Service? • Sebuah Service adalah BUKAN proses yang terpisah. Obyek Service itu sendiri tidak berarti dia berjalan dalam prosesnya sendiri; kecuali ditentukan lain, aplikasi tersebut akan berjalan sama dengan aplikasi yang lain. • Sebuah Service BUKAN thread. Itu bukan berarti dia sendiri tidak melakukan pekerjaan dari thread utama (untuk mencegah kesalahan “Application Not Responding”) • Suatu fasilitas untuk aplikasi memberi tahu sistem tentang sesuatu yang ingin dikerjakan dalam background (juga saat user tidak secara langsung berinteraksi dengan aplikasi). Ini berhubungan dengan pemanggilan ke Context.startService(), yang mana menjawab sistem untuk mengatur pekerjaan untuk service, akan berjalan sampai service atau seseorang secara eksplisit menghentikannya. • Sebuah fasilitas untuk sebuah aplikasi mengekspose beberapa dari fungsionalitasnya ke aplikasi yang lain. Ini berhubungan pada pemanggilan ke Context.bindService(), yang mana membiarkan sebuah koneksi long-standing untuk dibuat ke service untuk berinteraksi dengannya. Ketika sebuah komponen Service dibuat, untuk alasan yang lain, semua sistem secara aktual menginstansiasi komponen dan memanggil onCreate() nya. Service itu sangat sederhana, yang memberikan dua fitur utama: • Sebuah fasilitas bagi aplikasi untuk memberitahu sistem mengenai sesuatu yang akan dikerjakannya di latar belakang (bahkan pada saat user sedang secara tidak langsung berinteraksi dengan aplikasi). Ini berhubungan dengan panggilan ke Context.startService(), yang meminta sistem untuk menjadualkan pekerjaan untuk
•
service, untuk dikerjakan sampai service atau seseorang secara eksplisit menghentikannya. Sebuah fasilitas bagi sebauh aplikasi untuk mengekspos beberapa dari fungsionalitas ke aplikasi lain. Hal ini berhubungan dengan panggilan ke Context.bindService(), yang mengijinkan sebuah hubungan yang panjang yang akan dibuat ke service untuk berinteraksi dengannya.
Ketika sebuah komponen Service benar-benar dibuat, yang benar-benar dilakukan oleh semua sistem adalah meng-instantiate komponen dan memanggil onCreate() nya dan melakukan callback yang sesuai di untaian utama. Terserah kepada Service itu sendiri untuk mengimplementasikan hal-hal ini dengan cara yang sesuai, misalnya membuat sebuah untaian sekunder dimana dia melakukan pekerjaannya. C. PRAKTIK 1. Buat sebuah project baru 2. Buat layout sebagai berikut
android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:text="Broadcast Intent" android:onClick="broadcastIntent" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" />
3. Tambahkan dalam file java-nya, menjadi (perhatikan pada package sesuaikan dengan paket yang anda buat) package com.example.lucianugraheni.trybroadcast; import import import import import import import import import import
android.content.Intent; android.os.Bundle; android.support.design.widget.FloatingActionButton; android.support.design.widget.Snackbar; android.support.v7.app.AppCompatActivity; android.support.v7.widget.Toolbar; android.view.Menu; android.view.MenuItem; android.view.View; android.widget.Button;
public class MainActivity extends AppCompatActivity { Button butBatt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //mungkin ada bagian lain disini butBatt = (Button) findViewById(R.id.button3); } // broadcast a custom intent. public void broadcastIntent(View view){ Intent intent = new Intent(); intent.setAction("com.example.lucianugraheni.CUSTOM_INTENT"); sendBroadcast(intent); } //mungkin ada bagian lain disini }
4. Buat sebuah file java yang meng-extend broadcast receiver. package com.example.lucianugraheni.trybroadcast; import import import import
android.content.BroadcastReceiver; android.content.Context; android.content.Intent; android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); } }
5. Daftarkan pada ManifestAndroid.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lucianugraheni.trybroadcast">
6. Jalankan dan amati hasilnya. 7. Sekarang kita akan menambahkan Broadcast Receiver yang lain. 8. Tambahkan pada layout-nya sebuah Button. <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button3" android:text="Broadcast Baterry" android:onClick="broadcastBatt" android:layout_below="@+id/button2" android:layout_centerHorizontal="true" />
9. Tambahkan dalam MainActivity public void broadcastBatt(View view){ butBatt.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View arg0) { Intent intent = new Intent(MainActivity.this, BaterryStatus.class); startActivity(intent); } });
10. Tambahkan sebuah layout dengan nama batt.xml
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Kembali ke halaman sebelumnya" android:onClick="kembali" android:id="@+id/butKembali"/>
11. Tambahkan file java dengan nama BaterryStatus.java package com.example.lucianugraheni.trybroadcast; import import import import import import import import
android.content.BroadcastReceiver; android.content.Context; android.content.DialogInterface; android.content.Intent; android.content.IntentFilter; android.net.Uri; android.os.BatteryManager; android.os.Bundle;
import import import import import import import import
android.support.v7.app.AlertDialog; android.support.v7.app.AppCompatActivity; android.view.View; android.widget.ArrayAdapter; android.widget.Button; android.widget.ImageView; android.widget.ProgressBar; android.widget.TextView;
public class BaterryStatus extends AppCompatActivity { private ProgressBar bar; private ImageView status; private TextView level; private Button butKembali; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.batt); bar = (ProgressBar) findViewById(R.id.bar); status = (ImageView) findViewById(R.id.status); level = (TextView) findViewById(R.id.level); registerReceiver(onBattery, new IntentFilter( Intent.ACTION_BATTERY_CHANGED)); butKembali = (Button) findViewById(R.id.butKembali); } public void kembali(View view){ butKembali.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(BaterryStatus.this, MainActivity.class); startActivity(intent); } }); } BroadcastReceiver onBattery = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { int pct = 100 * intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 1) / intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1); bar.setProgress(pct); level.setText(String.valueOf(pct)); switch (intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1)) { case BatteryManager.BATTERY_STATUS_CHARGING: status.setImageResource(R.drawable.charging); break; case BatteryManager.BATTERY_STATUS_FULL: int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); if (plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB) { status.setImageResource(R.drawable.full); } else { status.setImageResource(R.drawable.unplugged); } break; default: status.setImageResource(R.drawable.unplugged); break; }
} }; }
12. Dan tambahkan juga dalam AndroidManifest.xml , untuk mendaftarkan activity.
13. Jalankan dan amati hasilnya. 14. Sekarang kita akan menambahkan Service. 15. Pertama kita membuat sebuah menu pada layout batt.xml dan BaterryStatus.java 16. Tambahkan pada layout batt.xml sebuah Button. <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pilih Service" android:layout_gravity="center" android:id="@+id/btnService"/>
17. Deklarasikan variabel Button pada BaterryStatus.java dengan nama btnMenu, tambahkan pada deklarasi Button yang sudah ada. 18. Tambahkan pada method onCreate, sebagai berikut final String[] option = {"Facebook", "Twitter", "Telpon", "Sms"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, option); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select Option"); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { if (i == 0) { Intent intfb = new Intent(Intent.ACTION_VIEW, Uri.parse("https://facebook.com")); startActivity(intfb); } else if (i == 1) { Intent inttw = new Intent(Intent.ACTION_VIEW, Uri.parse("https://twitter.com")); startActivity(inttw); } else { if (i == 2) { Intent inttel = new Intent(Intent.ACTION_CALL, Uri.parse("tel:+628888999")); startActivity(inttel); } else { Intent intsms = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:+6288889999")); intsms.putExtra("sms_body", "Halo apa kabar"); startActivity(intsms); } } } });
final AlertDialog a = builder.create(); btnMenu = (Button) findViewById(R.id.btnService); btnMenu.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { a.show(); } });
19. Tambahkan pada AndroidManifest.xml dua buah permission, sebagai berikut <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.SEND_SMS"/>
20. Jalankan dan amati hasilnya.
D. LATIHAN •
Latihan diberikan oleh dosen pengampu pada saat praktikum.
•
Dikerjakan di laboratorium pada jam praktikum.
E. TUGAS •
Tugas diberikan oleh dosen pengampu pada akhir praktikum.
•
Dikerjakan di rumah dan dilampirkan pada laporan.