Mengenal Service dalam Android

Belajar Android Mengenal Service Bagian 1

Service pada Android sebelum masuk materi utama para pembaca sekalian tentu pernah menonton pertandiangan bulutangkis atau baminton. Kalau kita perhatikan sewaktu nonton pertandingan bulutangkis, pasti pernah mendengar kata service. Yah service adalah pukulan bola pertama kali kepada tim yang baru saja mendapatkan point. Kita tidak akan bicara banyak tentang service di bulutangkis. Kita akan bahas tentang Service di Android.
Service adalah Komponen Aplikasi android yang bekerja dibelakang layar, tanpa user interface dan interaksi dengan user. Kalau kita analogikan dengan dunia nyata misalnya di film peran service ini adalah orang-orang yang dibelakang layar seperti penata music, penata gambar, penata rias, kameramen, sutradara dan lainnya.
Kalau yang sudah pakai android, pasti terkesan dengan GMAIL yang tanpa kita buka Aplikasinya bisa menotifikasi kalau ada email baru masuk.
Saat ini kita belum pantas berandai-andai untuk buat aplikasi seperti GMAIL kalau konsep dasar Service aja tidak tahu, sekarang mari kita mulai dari yang sederhana. Walaupun membosankan dan melelahkan tapi kalau kita jalani dengan sepenuh hati insya Allah hasilnya akan banyak manfaatnya. Jujur saja saya sering cepat ngantuk kalau baca buku programming apa lagi bahasa inggris hehe :) tapi kalau baca Novel best Seller mata seakan bersemangat untuk menghabiskannya. Padahal kalau dilihat dari sisi manfaat harusnya kita lebih semangat.
Yuk kita mulai Aplikasi Service Sederhana.
  1. Buat Android Project dengan Nama LearnService

  2. Buat Class baru dengan nama TheService

01package net.agusharyanto.learnservice;
02 
03import android.app.Service;
04import android.content.Intent;
05import android.os.IBinder;
06import android.widget.Toast;
07 
08public class TheService extends Service {
09    @Override
10    public IBinder onBind(Intent arg0) {
11        return null;
12    }
13 
14    @Override
15    public int onStartCommand(Intent intent, int flags, int startId) {
16        // We want this service to continue running until it is explicitly
17        // stopped, so return sticky.
18        Toast.makeText(this, "The Service Started", Toast.LENGTH_LONG).show();
19        return START_STICKY;
20    }
21 
22    @Override
23    public void onDestroy() {
24        super.onDestroy();
25        Toast.makeText(this, "The Service Destroyed", Toast.LENGTH_LONG).show();
26    }
27}
Perhatikan Class TheService mengekstend class Service ini menandakan bahwa Class TheService dinyatakan sebagai Service.
Pada Service diatas kita mengimplementasika 3 method.
  • Method onBind(). Method ini membuat kita dapat mengkomunikasikan Activity dengan Service.
  • Method onStartCommand(). Method ini akan dipanggil pada saat Service diStart dengan perintah startService(). Jika pada method ini kita mereturn START_STICKY maka service akan jalan terus sampai Service di Stop.
  • Method onDestroy(). Method ini dipanggil ketika service distop.
4. Agar service kita dapat digunakan, harus didaftarkan pada AndroidManifest.xml. Caranya dengan menambahkan <service android:name=“.TheService” />
01xml version="1.0" encoding="utf-8"?>
02<manifest xmlns:android="http://schemas.android.com/apk/res/android"
03    package="net.agusharyanto.learnservice"
04    android:versionCode="1"
05    android:versionName="1.0" >
06 
07    <uses-sdk
08        android:minSdkVersion="14"
09        android:targetSdkVersion="17" />
10 
11    <application
12        android:allowBackup="true"
13        android:icon="@drawable/ic_launcher"
14        android:label="@string/app_name"
15        android:theme="@style/AppTheme" >
16        <activity
17            android:name="net.agusharyanto.learnservice.LearnServiceActivity"
18            android:label="@string/app_name" >
19            <intent-filter>
20                <action android:name="android.intent.action.MAIN" />
21 
22                <category android:name="android.intent.category.LAUNCHER" />
23            </intent-filter>
24        </activity>
25        <service android:name=".TheService" />
26    </application>
27 
28</manifest>
5. Sekarang kita kerjakan bagian User Interfacenya, edit main.xml, lalu ketikkan kode berikut
01xml version="1.0" encoding="utf-8"?>
02<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03    android:layout_width="fill_parent"
04    android:layout_height="fill_parent"
05    android:orientation="vertical" >
06 
07    <Button
08        android:id="@+id/btnStartService"
09        android:layout_width="fill_parent"
10        android:layout_height="wrap_content"
11        android:onClick="startService"
12        android:text="Start Service" />
13 
14    <Button
15        android:id="@+id/btnStopService"
16        android:layout_width="fill_parent"
17        android:layout_height="wrap_content"
18        android:onClick="stopService"
19        android:text="Stop Service" />
20 
21</LinearLayout>
    Pada code diatas kita membuat dua Button yaitu button Start Serviceyang apabila diklik akan menjalankan method startServicedan Stop Service yang apabila diklik akan menjalankan method stopService
5. Buka file LearnServiceActivity.java, lalu ketikkan kode berikut
01package net.agusharyanto.learnservice;
02 
03import android.app.Activity;
04import android.content.Intent;
05import android.os.Bundle;
06import android.view.View;
07 
08public class LearnServiceActivity extends Activity {
09 
10    @Override
11    protected void onCreate(Bundle savedInstanceState) {
12        super.onCreate(savedInstanceState);
13        setContentView(R.layout.main);
14    }
15 
16    public void startService(View view) {
17        startService(new Intent(getBaseContext(), TheService.class));
18    }
19 
20    public void stopService(View view) {
21        stopService(new Intent(getBaseContext(), TheService.class));
22    }
23 
24}
    Pada saat Aplikasi ini dijalankan maka akan Menjalankan LearnServiceActivity dan langsung mengeksekusimethod onCreate dalam hal ini kan menmapilkan user interface yang telah kita buat pada file main.xml.Perhatikan method startService disini terdapat syntak yang digunakn untuk menstart Sebuah Service
    dalam hal ini TheService.class Dengan menggunakan perintah
    startService(new Intent(getBaseContext(), TheService.class));
    Sedangkan pada method stopService akan Menstop Service dengan menjalankan perintah

    stopService(
    new Intent(getBaseContext(), TheService.class));
7. Saatnya kita jalankan program kita, lalu klik Start Service maka akan menampikan Toast “The Service Started” 
Klik button Stop Service maka akan menampilkan Toast “Stop Service”
Wah, kalau cuma gitu doang mah buat apa pakai service. Tenang ini baru awal, berlanjut ke tutorial android Service Bagian 2

Belajar Android Mengenal Service Bagian 2

Setelah memahami tutorial Belajar Android Mengenal Service Bagian 1 mari kita melangkah kebagian yang lebih seru dalam penggunaan service ini, topiknya kali ini adalah memanfaatkan service untuk proses yang memakan waktu lama, misalnya mendownload file.
Oke kita mulai saja
1. Buka kembali project LearnService
2. Edit File Class TheService lalu ketikan kodenya seperti dibawah ini.
01package net.agusharyanto.learnservice;
02 
03import java.net.MalformedURLException;
04import java.net.URL;
05 
06import android.app.Service;
07import android.content.Intent;
08import android.os.IBinder;
09import android.widget.Toast;
10 
11public class TheService extends Service {
12    @Override
13    public IBinder onBind(Intent arg0) {
14        return null;
15    }
16 
17    @Override
18    public int onStartCommand(Intent intent, int flags, int startId) {
19        // We want this service to continue running until it is explicitly
20        // stopped, so return sticky.
21        // Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
22        try {
23            int result = DownloadFile(new URL(
24                    "http://agusharyanto.net/hadiah.pdf"));
25            Toast.makeText(getBaseContext(), "Downloaded " + result + " bytes",
26                    Toast.LENGTH_LONG).show();
27        } catch (MalformedURLException e) {
28            // TODO Auto-generated catch block
29            e.printStackTrace();
30        }
31        return START_STICKY;
32    }
33 
34    private int DownloadFile(URL url) {
35        try {
36            // ---simulate taking some time to download a file---
37            Thread.sleep(5000);
38        } catch (InterruptedException e) {
39            e.printStackTrace();
40        }
41        // ---return an arbitrary number representing
42        // the size of the file downloaded---
43        return 100;
44    }
45 
46    @Override
47    public void onDestroy() {
48        super.onDestroy();
49        Toast.makeText(this, "The Service Destroyed", Toast.LENGTH_LONG).show();
50    }
51}
3. Tambahkan Permision Internet pada AndroidManifest.xml
“android.permission.INTERNET”
> 4. Sekarang mari kita jalankan programnya.

Lho Kok 100 bytes pak, padahalkan filenya 53kb. Hehe jelas bang, kan memang kita belum melakukan pemanggilan ke server.
Nah untuk yang ada kaitannya dengan komunikasi dengan server kita dianjurkan untuk menggunakan AssynchTask.
4. Ubah kembali class TheService lalu rubah codenya mejadi seperti ini.
01package net.agusharyanto.learnservice;
02 
03import java.io.IOException;
04import java.net.MalformedURLException;
05import java.net.URL;
06import java.net.URLConnection;
07 
08import android.app.Service;
09import android.content.Intent;
10import android.os.AsyncTask;
11import android.os.IBinder;
12import android.util.Log;
13import android.widget.Toast;
14 
15public class TheService extends Service {
16    @Override
17    public IBinder onBind(Intent arg0) {
18        return null;
19    }
20 
21    @Override
22    public int onStartCommand(Intent intent, int flags, int startId) {
23        // We want this service to continue running until it is explicitly
24        // stopped, so return sticky.
25        // Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
26        try {
27            new DoBackgroundTask().execute(new URL(
28                    "http://agusharyanto.net/android/dl/sylabus1.pdf"),
29                    new URL("http://agusharyanto.net/android/dl/sylabus2.pdf"),
30                    new URL("http://agusharyanto.net/android/dl/sylabus3.pdf"),
31                    new URL("http://agusharyanto.net/android/dl/sylabus4.pdf"));
32        } catch (MalformedURLException e) {
33            // TODO Auto-generated catch block
34            e.printStackTrace();
35        }
36        return START_STICKY;
37    }
38 
39    private int DownloadFile(URL url) {
40        int file_size = 0;
41        try {
42            // ---simulate taking some time to download a file---
43            URLConnection urlConnection = url.openConnection();
44            urlConnection.connect();
45            file_size = urlConnection.getContentLength();
46        } catch (IOException e) {
47            e.printStackTrace();
48        }
49        // ---return an arbitrary number representing
50        // the size of the file downloaded---
51        return file_size;
52    }
53 
54    private class DoBackgroundTask extends AsyncTask {
55        protected Long doInBackground(URL... urls) {
56            int count = urls.length;
57            long totalBytesDownloaded = 0;
58            for (int i = 0; i < count; i++) {
59                totalBytesDownloaded += DownloadFile(urls[i]);
60                // ---calculate percentage downloaded and
61                // report its progress---
62                publishProgress((int) (((i + 1) / (float) count) * 100));
63            }
64            return totalBytesDownloaded;
65        }
66 
67        protected void onProgressUpdate(Integer... progress) {
68            Log.d("Downloading files", String.valueOf(progress[0])
69                    + "% downloaded");
70            Toast.makeText(getBaseContext(),
71                    String.valueOf(progress[0]) + "% downloaded",
72                    Toast.LENGTH_LONG).show();
73        }
74 
75        protected void onPostExecute(Long result) {
76            Toast.makeText(getBaseContext(), "Downloaded " + result + " bytes",
77                    Toast.LENGTH_LONG).show();
78            stopSelf();
79        }
80    }
81 
82    @Override
83    public void onDestroy() {
84        super.onDestroy();
85        Toast.makeText(this, "The Service Destroyed", Toast.LENGTH_LONG).show();
86    }
87}
5. Sekarang mari kita jalankan kembali

Pada kode diatas ketika tombol Start Service ditap, maka service akan mengeksekusi perintah yang ada dalam method onStartCommand yang akan mendowload 4 file disini disimulaikan setiap 1 file selesai akan menambah progress 25% dan setelah selesai dihitung total bytes yang di download dan mengeksekusi perintah stopSelf() yang akan mematikan Service.
Kalau bisa begini jadi ada Ide buat Aplikasi Lagu Anak. Tadinya mikir kalau buat aplikasi lagu itu akan besar filenya dan ini akan membuat User ragu untuk downlaodya, tapi dengan adanya proses seperti ini saya bisa buat playernya saja lalu untuk file mp3nya didownload pada saat user menjalankan aplikasi. Tapi jangan lupayah kalau semua file sudah di download, ketika user membuka aplikasi kembali service tidak boleh jalan lagi, untuk menangani ini bisa gunakan Shared Preference. Masih ada lanjutan dari pengenalan Android Service ini, nantikan tutorial android service bagian 3.


sumber:
Beginning Android 4 Application Development – Wei Meng-Lee
http://agusharyanto.net/

Share this

Related Posts

Previous
Next Post »