Membuat Service di Android

Suatu service adalah suatu app di Android yang berjalan di background dan app ini tidak perlu berinteraksi dengan user. Misalnya, sambil mengaktifkan suatu app, kita mungkin ingin mendengarkan musik di background pada saat yang bersamaan. Dalam hal ini, kode yang memainkan musik di background tidak perlu berinteraksi dengan user, dan karena itu dapat dijalankan sebagai suatu service. Service juga sangat ideal untuk berbagai macam situasi dimana tidak perlu menampilkan UI ke user. Contoh yang bagus untuk hal ini adalah app yang secara kontinyu mencatat log koordinat geografi dari perangkat yang digunakan. Dalam hal seperti itu, kita bisa menuliskan kode service yang berjalan di background. Pada topik ini kita akan berlatih membuat service sendiri dan menggunakannya untuk menlakukan tugas-tugas di background secara asynchronous.

Latihan membuat service:

1. Kita buat project dengan nama "Services" di Android Studio.

2. Kita tambahkan/buat baru file Java dan kita beri nama "MyService.java", dan kita tuliskan kode seperti berikut di bawah ini:
package com.example.services; 
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class MyService extends Service {

@Override
public IBinder onBind(Intent arg0) {
return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
/*kita ingin agar service ini terus berjalan hingga
di-stop secara eksplisit, sehingga akan mengembalikan/return sticky */
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}

@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}
3. Kita modifikasi file "AndroidManifest.xml" dengan menambahkan elemen yang ditulis tebal sepert berikut:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.services">

<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>
</activity>
<service android:name=".MyService" />
</application>

</manifest>
4. Kita modifikasi file "activity_main.xml" dengan mengganti elemen 'TextView' seperti berikut di bawah ini:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.services.MainActivity">

<Button android:id="@+id/btnStartService"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start Service"
android:onClick="startService"/>

<Button android:id="@+id/btnStopService"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Stop Service"
android:onClick="stopService"/>
</LinearLayout>
5. Terakhir, kita tambahkan kode berikut dalam file "MainActivity.java" seperti berikut:
package com.example.services;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

public void startService(View view) {
startService(new Intent(getBaseContext(), MyService.class));
}



public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
}
}
Kemudian, jalankan di Android emulator seperti gambar di bawah ini. Tombol "Start Service" dan "Stop Stop Service" untuk menjalankan dan men-stop service.


Penjelasan:

Contoh dalam latihan ini menunjukkan service yang paling sederhana yang bisa kita buat. Tentu saja, service ini sendiri tidak melakukan sesuatu yang bermanfaat, tetapi hanya sekedar memberi ilustrasi proses pembuatannya.

Pertama, kita membuat suatu 'class' yang menerapkan 'extends' dari class "Service". Semua service harus menerapkan ini (extend dar class "Service").
public class MyService extends Service {
}
Di dalam class "MyService", kita mengimplementasikan tiga method:
@Override
public IBinder onBind(Intent arg0) {
...
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
}

@Override
public void onDestroy() {
...
}

Method 'onBind()' membuat kita bisa mengikat suatu 'activity' ke suatu service. Method ini pada gilirannya memungkinkan suatu 'activity' untuk mengakses secara langsung anggota-anggota dan method-method di dalam suatu service. Untuk latihan ini, supaya mudah kita kembalikan nilai 'null' untuk method ini. Berikutnya kita akan mempelajari lebih jauh tentang hal ini.

Method 'onStartCommand()' dipanggil ketika kita memulai service secara eksplisit dengan menggunakan method 'startService()'. Method ini menandakan mulainya service, dan kita menuliskan kode tersebut untuk melakukan hal-hal yang perlu dilakukan pada service yang kita buat. Dalam method ini, kita mengembalikan nilai konstanta 'START_STICKY' sehingga service akan terus berjalan sampai service tersebut di-stop secara eksplisit.

Method 'onDestroy()' dipanggil bila service di-stop dengan menggunakan method 'stopService()'. Ini akan terjadi dimana kita akan membersihkan semua resources yang digunakan oleh service yang kita buat.

Semua service yang kita buat harus di-deklarasikan dalam file 'AndroidManifest.xml', seperti berikut:
<service android:name=".MyService" />
Bila kita ingin service yang kita buat bisa diakses oleh app yang lain, kita menambahkan suatu 'intent filter' dengan suatu 'action name', seperti berikut:
<service android:name=".MyService">
<intent-filter>
<action android:name="com.example.MyService" />
</intent-filter>
</service>
Untuk memulai suatu service, kita menggunakan method 'startService()', seperti berikut:
public void startService(View view) {
startService(new Intent(getBaseContext(), MyService.class));
}

Bila kita memanggil service ini dari app eksternal, maka panggilan ke method 'startService()' akan seperti berikut:
startService(new Intent("com.example.MyService"));
Untuk men-stop service, kita menggunakan method 'stopService()':
public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
}

No comments: