Оё ягон вақт дар таҳияи барномаҳои 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:
onCreate(): Сохтани Service.onStartCommand(): Ҳар дафъае, ки дархост барои оғоз кардани Service мешавад.onDestroy(): Нобуд кардани Service.
Цикли ҳаёти Bound Service:
onCreate(): Сохтани Service.onBind(): Ҳангоми пайваст кардани муштарӣ ба Service. ВайIBinder-ро бармегардонад.onUnbind(): Ҳангоми аз пайваст кардани ҳамаи муштарӣ. ВайonDestroy()-ро даъват мекунад.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 маҳдудиятҳои системаро ба назар мегирад ва иҷрои вазифаҳоро идора мекунад, ҳатто агар барнома баста шавад ё дастгоҳро навсозӣ кунанд.