Sobes.tech
Junior

Оё ягон вақт дар таҳияи барномаҳои Android аз Service истифода кардаед?

sobes.tech AI

Ҷавоб аз AI

Бале, истифода кардам. Service дар Android барои иҷрои амалҳои дарозмуддат дар фони бе интерфейси корбар истифода мешавад.

Сценарияҳои асосӣ:

  • Навозиш кардани мусиқӣ дар фони.
  • Download кардани файлҳо.
  • Синхронизатсияи маълумот бо сервер.
  • Тарҷумаи ҷойгиршавӣ.

Типҳои Service:

  • Started Service: Аз ҷониби компоненти барнома (масалан, Activity) оғоз мешавад ва мустақил кор мекунад. Бо истифода аз stopSelf() ё stopService() қатъ мешавад.
  • Bound Service: Интерфейси клиент-серверро пешниҳод мекунад. Компонентҳо бо bindService() ба Service пайваст мешаванд ва тавассути IBinder муошират мекунанд. Вақте ки ҳамаи компонентҳо пайваст мешаванд, қатъ мешавад.
  • Foreground Service: Амалиётҳоро иҷро мекунад, ки барои корбар намоёнанд (масалан, навозиш кардани мусиқӣ). Бо истифода аз startForeground() оғоз мешавад ва огоҳӣ талаб мекунад. Система чунин Service-ро камтар мебандад.

Цикли ҳаёти Started Service:

  1. onCreate(): Сохтани Service.
  2. onStartCommand(): Ҳар дафъае, ки дархост барои оғоз кардани Service мешавад.
  3. onDestroy(): Нобуд кардани Service.

Цикли ҳаёти Bound Service:

  1. onCreate(): Сохтани Service.
  2. onBind(): Ҳангоми пайваст кардани муштарӣ ба Service. Вай IBinder-ро бармегардонад.
  3. onUnbind(): Ҳангоми аз пайваст кардани ҳамаи муштарӣ. Вай onDestroy()-ро даъват мекунад.
  4. onDestroy(): Нобуд кардани Service.

Масалан барои оғоз кардани Started Service:

// 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 {
            // UI-и шумо
            // Масалан барои оғоз кардани Service
            val serviceIntent = Intent(this, MyStartedService::class.java)
            startService(serviceIntent)
        }
    }
}

Масалан барои Started Service оддӣ:

// 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")
        // иҷрои амали дарозмуддат дар фони
        Thread {
            for (i in 0..10) {
                Log.d(TAG, "Итерация $i")
                try {
                    Thread.sleep(1000)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
            stopSelf() // қатъ кардани Service пас аз анҷоми вазифа
        }.start()

        return START_STICKY // такрори оғоз кардани Service агар системаи онро қатъ кунад
    }

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

    override fun onBind(intent: Intent?): IBinder? {
        // барои Started Service null бармегардонем
        return null
    }
}

Муҳим аст, ки Service дар асоси пешфарз дар асоси асосӣ кор мекунад. Барои иҷрои амали дарозмуддат, ки монеа эҷод мекунанд, лозим аст, ки ҷадвалҳо ё Kotlin coroutines истифода шаванд, то UI монеа нарасад.

Ҳангоми кор бо вазифаҳои дарозмуддат, беҳтар аст, ки WorkManager истифода шавад, ки муносибати бештар флексибл ва боэътимод барои иҷрои вазифаҳои таъхирдода ва кафолатдода пешниҳод мекунад. WorkManager маҳдудиятҳои системаро ба назар мегирад ва иҷрои вазифаҳоро идора мекунад, ҳатто агар барнома баста шавад ё дастгоҳро навсозӣ кунанд.