Sobes.tech
Junior

Android tətbiqlərinin inkişafında Service-dən istifadə etdinizmi?

sobes.tech Süni İntellekt

AI-dan cavab

Bəli, istifadə etdim. Android-də Service uzunmüddətli əməliyyatları istifadəçi interfeysindən kənarda yerinə yetirmək üçün istifadə olunur.

Əsas istifadə ssenariləri:

  • Fon rejimində musiqi ifa etmək.
  • Faylları yükləmək.
  • Server ilə məlumatların sinxronizasiyası.
  • Mövqeyin izlənməsi.

Service növləri:

  • Started Service: Tətbiq komponenti (məsələn, Activity) tərəfindən başlatılır və müstəqil işləyir. stopSelf() və ya stopService() metodu ilə dayandırılır.
  • Bound Service: Müştəri-server interfeysi təmin edir. Komponentlər bindService() metodu ilə Service-ə bağlanır və IBinder vasitəsilə onunla qarşılıqlı əlaqə qurur. Bütün komponentlər bağlandıqda dayandırılır.
  • Foreground Service: İstifadəçiyə görünən əməliyyatları yerinə yetirir (məsələn, musiqi ifası). startForeground() ilə başlatılır və bildiriş tələb edir. Sistem belə Service-ə daha az müdaxilə edir.

Started Service-in həyat dövrü:

  1. onCreate(): Service yaradılır.
  2. onStartCommand(): Service-ə hər çağırışda çağırılır.
  3. onDestroy(): Service məhv edilir.

Bound Service-in həyat dövrü:

  1. onCreate(): Service yaradılır.
  2. onBind(): Müştəri Service-ə bağlananda çağırılır. IBinder qaytarır.
  3. onUnbind(): Bütün müştərilər bağlandıqda çağırılır.
  4. onDestroy(): Service məhv edilir.

Started Service-in işə salınması nümunəsi:

// MainActivity.kt
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            // Sizin UI
            // Service-in işə salınması nümunəsi
            val serviceIntent = Intent(this, MyStartedService::class.java)
            startService(serviceIntent)
        }
    }
}

Sadə Started Service nümunəsi:

// MyStartedService.kt
import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.util.Log

class MyStartedService : Service() {

    private val TAG = "MyStartedService"

    override fun onCreate() {
        super.onCreate()
        Log.d(TAG, "onCreate")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d(TAG, "onStartCommand")
        // Uzunmüddətli əməliyyatı fon rejimində yerinə yetirir
        Thread {
            for (i in 0..10) {
                Log.d(TAG, "Iteration $i")
                try {
                    Thread.sleep(1000)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
            stopSelf() // Tapşırıq tamamlandıqda Service-i dayandırır
        }.start()

        return START_STICKY // Service-ı sistem öldürsə, yenidən başlat
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d(TAG, "onDestroy")
    }

    override fun onBind(intent: Intent?): IBinder? {
        // Started Service üçün null qaytarırıq
        return null
    }
}

Əhəmiyyətlidir ki, Service standart olaraq əsas axında işləyir. Uzunmüddətli və bloklayıcı əməliyyatlar üçün ayrıca axınlar və ya Kotlin korotinləri istifadə etmək lazımdır ki, UI bloklanmasın.

Uzunmüddətli tapşırıqlarla işləyərkən WorkManager-dən istifadə etmək daha üstün olur, çünki bu, daha çevik və etibarlı gecikmiş və zəmanətli tapşırıqlar üçün yanaşma təmin edir. WorkManager sistem məhdudiyyətlərini nəzərə alır və tapşırıqları yerinə yetirir, hətta tətbiq bağlanıb və ya cihaz yenidən başlatılıbsa belə.