Sobes.tech
Junior

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

sobes.tech AI

Ҷавоб аз AI

Бале, истифода бурдаам. Service — ин компоненти барномаест, ки метавонад амалиётҳои дарозмуддатро дар пасзамина иҷро кунад, бе вобастагӣ ба интерфейси корбар. Service UI-и худро надорад.

Service метавонад дар се ҳолат кор кунад:

  1. Started: Service бо даъвати startService() оғоз мешавад. Он мустақил аз компоненти, ки онро оғоз кардааст, кор мекунад. Одатан барои иҷрои амалиёти яккарата, масалан, боргирии файл, истифода мешавад.
  2. Bound: Service бо даъвати bindService() оғоз мешавад. Он ба компоненти, ки онро даъват кардааст, вобаста аст. Имкон медиҳад, ки компонентҳои барнома бо Service ҳамкорӣ кунанд. Service то он даме, ки ба он пайваст ҳастанд, зинда мемонад.
  3. Foreground: Service бо даъвати startForeground() оғоз мешавад. Амалиётҳоро иҷро мекунад, ки барои корбар эҳсосшавандаанд (масалан, навозиши мусика). Система камтар эҳтимол дорад, ки foreground Service-ро бо сабаби норасоии хотира нобуд кунад. Нотиқро талаб мекунад.

Методҳои калидии давраи ҳаёти:

  • onCreate(): Вақте ки Service аввалин бор сохта мешавад, иҷро мешавад.
  • onStartCommand() ё onBind(): вобаста ба усули оғоз.
    • onStartCommand(): ҳар вақте ки компонент startService()-ро даъват мекунад, иҷро мешавад.
    • onBind(): вақте ки bindService()-ро даъват мекунанд, иҷро мешавад. IBinder-ро барои ҳамкорӣ бармегардонад.
  • onDestroy(): пеш аз нобуд кардани Service-ро даъват мекунад.

Масалан, истифодаи Started Service барои иҷрои вазифаи дарунӣ:

class MyStartedService : Service() {

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // иҷрои амали дарозмуддат дар ҷараёни алоҳида
        Thread {
            // Масалан: боргирии маълумот
            Log.d("MyStartedService", "Service started")
            try {
                Thread.sleep(5000) // имитацияи кор
            } catch (e: InterruptedException) {
                Thread.currentThread().interrupt()
            }
            Log.d("MyStartedService", "Operation finished")
            stopSelf(startId) // боздошти сервиса пас аз иҷрои вазифа
        }.start()

        return START_STICKY // Ё START_NOT_STICKY, START_REDELIVER_INTENT
    }

    override fun onBind(intent: Intent?): IBinder? {
        return null // Мо истифода намебарем bound Service
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("MyStartedService", "Service destroyed")
    }
}

Барои амалиётҳои дарозмуддат, ки талаб мекунанд, ки иҷрои кафолатнок дошта бошанд ва дар ҷараёни алоҳида кор кунанд, беҳтар аст, ки WorkManager-ро истифода баред, ки дар асоси Service сохта шудааст, аммо API-ро боэътимод ва чандиртар пешниҳод мекунад.