آموزش Service در کاتلین

سلام دوستان عزیز در این سری از آموزش برنامه نویسی اندروید به آموزش Service در کاتلین (kotlin) می پردازیم از سرویس بیشتر به منظور انجام کار خاصی در background نرم افزار استفاده می شود و تنها به این محدود نمی شود کارهای خاص دیگر نیز می توان با سرویس (service) انجام داد در ادامه با ما همراه باشید تا نحوه پیاده سازی آموزش Service در کاتلین را یاد گیرید.
 

کاربرد های سرویس در برنامه نویسی اندروید

  • location listener
  • API, provide services to other apps
  • sound module
  • in app billing
  • Communication with webservices

بای پیاده سازی سرویس 3 کار باید انجام شود
ابتدا تعریف سرویس
تعریف سرویس در androidmanifest
و در نهایت اجرای سرویس

import android.app.Service
import android.content.Intent
import android.os.Handler
import android.os.IBinder
import java.util.*
class RandomNumberService : Service() {
    private lateinit var mHandler: Handler
    private lateinit var mRunnable: Runnable
    override fun onBind(intent: Intent): IBinder? {
        throw UnsupportedOperationException("Not yet implemented")
    }
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        toast("Service started.")
        mHandler = Handler()
        mRunnable = Runnable { showRandomNumber() }
        mHandler.postDelayed(mRunnable, 5000)
        return Service.START_STICKY
    }
    override fun onDestroy() {
        super.onDestroy()
        toast("Service destroyed.")
        mHandler.removeCallbacks(mRunnable)
    }
    private fun showRandomNumber() {
        val rand = Random()
        val number = rand.nextInt(100)
        toast("Random Number : $number")
        mHandler.postDelayed(mRunnable, 5000)
    }
}

کلاس بالا یک سرویس ایجاد می کند تا یک عدد رندوم را در هربار اجرا ایجاد کند و آن عدد را Toast می کند. onBind و  onStartCommand متدهای خود سرویس هستن که ما کارهایی که می خواهیم انجام دهیم را در onStartCommand قرار می دهیم.
بعد از اینکه کلاس بالا را ایجاد کردید وارد AndroidManifest.xml شده و خط های زیر را در تگ application اضافه کنید.

    <service
            android:name=".RandomNumberService"
            android:enabled="true"
            android:exported="true"
            />

در صورتی که اضافه نکنید سرویس کار نخواهد کرد.
بعد از اینکار در لایه activity_main.xml کدهای زیر را قرار دهید.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/root_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#7b917b"
    android:orientation="vertical"
    android:padding="16dp"
    >
    <Button
        android:id="@+id/button_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Service"
        />
    <Button
        android:id="@+id/button_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop Service"
        />
    <Button
        android:id="@+id/button_stats"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Service Stats"
        />
</LinearLayout>

در لایه بالا سه تا دکمه قرار دادیم که هرکدام یک Action خواهند داشت.
و در MainActivity.kt هم کدهای زیر را قرار می دهیم.
 

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import android.app.ActivityManager
import android.content.Context
import android.widget.Toast
import android.content.Intent
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // Variable to hold service class name
        val serviceClass = RandomNumberService::class.java
        // Initialize a new Intent instance
        val intent = Intent(applicationContext, serviceClass)
        // Button to start the service
        button_start.setOnClickListener{
            // If the service is not running then start it
            if (!isServiceRunning(serviceClass)) {
                // Start the service
                startService(intent)
            } else {
                toast("Service already running.")
            }
        }
        // Button to stop the service
        button_stop.setOnClickListener{
            // If the service is not running then start it
            if (isServiceRunning(serviceClass)) {
                // Stop the service
                stopService(intent)
            } else {
                toast("Service already stopped.")
            }
        }
        // Get the service status
        button_stats.setOnClickListener{
            if (isServiceRunning(serviceClass)) {
                toast("Service is running.")
            } else {
                toast("Service is stopped.")
            }
        }
    }
    // Custom method to determine whether a service is running
    private fun isServiceRunning(serviceClass: Class<*>): Boolean {
        val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        // Loop through the running services
        for (service in activityManager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.name == service.service.className) {
                // If the service is running then return true
                return true
            }
        }
        return false
    }
}
// Extension function to show toast message
fun Context.toast(message:String){
    Toast.makeText(applicationContext,message,Toast.LENGTH_SHORT).show()
}

در واقع با دکمه هایی که قرار دادیم سرویس را

  • اجرا
  • متوقف
  • دریافت عدد رندوم

پیش نمایش اپلیکیشن بالا هم در ادامه می توانید مشاهده کنید.

 
 
موفق و پیروز باشید.

مطالعه بیشتر