WorkManager একটি Android Jetpack লাইব্রেরি যা গ্যারান্টিযুক্ত সম্পাদনের সাথে বিলম্বিত এবং ব্যাকগ্রাউন্ড কাজ সম্পাদনের জন্য ডিজাইন করা হয়েছে। Service বা JobScheduler-এর বিপরীতে, WorkManager কাজের生命周期 পরিচালনা করে: ব্যর্থ হলে এটি পুনরায় চালু করে, Android সংস্করণের সাথে খাপ খায় এবং ডিভাইসের সীমাবদ্ধতা বিবেচনা করে। Android Developers, 2026 অনুসারে, আধুনিক Android ডেভেলপমেন্টে বেশিরভাগ ব্যাকগ্রাউন্ড অপারেশনের জন্য WorkManager পছন্দের সমাধান।
মূল পয়েন্ট
WorkManager Android Jetpack-এর অংশ, একটি লাইব্রেরি ব্যাকগ্রাউন্ড কাজ পরিচালনার জন্য যা গ্যারান্টিযুক্তভাবে সম্পাদন করতে হবে, অ্যাপ অগ্রভাগে থাকুক বা ব্যবহারকারী বন্ধ করে দিক। লাইব্রেরি API 14+ সমর্থন করে এবং স্বয়ংক্রিয়ভাবে উপযুক্ত সম্পাদন পদ্ধতি নির্বাচন করে: Android 5+ এ JobScheduler, পুরানো সংস্করণে BroadcastReceiver + AlarmManager।
WorkManager-এর মূল বৈশিষ্ট্য হল গ্যারান্টিযুক্ত সম্পাদন। যদি ডিভাইস রিবুট, অ্যাপ শেষ হওয়া বা ক্র্যাশের কারণে কোনও কাজ সম্পূর্ণ না হয়, WorkManager এটি প্রথম সুযোগে পুনরায় চালু করবে। এটি লাইব্রেরিকে সম্পাদন-গুরুত্বপূর্ণ কাজের জন্য আদর্শ পছন্দ করে তোলে: অ্যানালিটিক্স পাঠানো, ডেটাবেস সিঙ্ক্রোনাইজেশন, লগ আপলোড।
Background Service-এর বিপরীতে, WorkManager-এর থ্রেড এবং লাইফসাইকেল পরিচালনার প্রয়োজন নেই। লাইব্রেরি নিজেই একটি থ্রেড পুল তৈরি করে, Doze Mode পরিচালনা করে, Android সংস্করণ বিবেচনা করে এবং API স্তর নির্বিশেষে একটি ইউনিফাইড API প্রদান করে। Coroutine এবং RxJava সমর্থন যথাক্রমে CoroutineWorker এবং RxWorker-এর মাধ্যমে উপলব্ধ।
WorkManager কাজের অবস্থা ট্র্যাক করার জন্য অন্তর্নির্মিত LiveData সমর্থন প্রদান করে। getWorkInfoByIdLiveData পদ্ধতি LiveData<WorkInfo> ফেরত দেয় যা প্রতিটি অবস্থা পরিবর্তনে আপডেট হয়: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED। এটি UI উপাদানগুলিকে Lifecycle-aware উপাদানের সাহায্যে শিডিউলারের ম্যানুয়াল পোলিং এবং মেমরি লিক ছাড়াই পরিবর্তনে প্রতিক্রিয়া জানাতে দেয়।
WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(syncRequest.id)
.observe(viewLifecycleOwner) { workInfo ->
when (workInfo.state) {
WorkInfo.State.SUCCEEDED ->
showSuccess()
WorkInfo.State.FAILED ->
showError(workInfo.outputData)
else ->
showProgress()
}
}
WorkManager-এর আর্কিটেকচার তিনটি বেস ক্লাসের চারপাশে নির্মিত: Worker, WorkRequest এবং WorkManager। Worker-এ কাজের লজিক থাকে, WorkRequest সম্পাদন প্যারামিটার বর্ণনা করে এবং WorkManager কিউ এবং শিডিউলিং পরিচালনা করে। লাইব্রেরি সমস্ত কাজের অবস্থা সংরক্ষণের জন্য একটি অভ্যন্তরীণ Room ডেটাবেস ব্যবহার করে।
Worker একটি অ্যাবস্ট্রাক্ট ক্লাস যার একটি একক পদ্ধতি doWork যা ব্যাকগ্রাউন্ড থ্রেডে কল করা হয়। পদ্ধতিটি ListenableWorker.Result — SUCCESS, FAILURE বা RETRY ফেরত দেয়। WorkRequest Worker-কে প্যারামিটারের সাথে সংযুক্ত করে: টাইমআউট, ট্যাগ, প্রাথমিক বিলম্ব এবং সীমাবদ্ধতা।
class SyncWorker(
context: Context,
params: WorkerParameters
) : Worker(context, params) {
override fun doWork(): Result {
return try {
val api = RetrofitClient.api
val response = api.syncData()
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
WorkManager Android সংস্করণ নির্বিশেষে অভিন্নভাবে কাজ নির্ধারণ করে। enqueue কল করার সময়, লাইব্রেরি কাজটি Room-এ সংরক্ষণ করে, বর্তমান অবস্থা মূল্যায়ন করে এবং সর্বোত্তম সম্পাদন সময় নির্বাচন করে। ভিতরে, এটি JobScheduler, AlarmManager বা নিজস্ব শিডিউলার ব্যবহার করতে পারে — ডেভেলপারকে এ নিয়ে চিন্তা করতে হবে না।
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
WorkManager দুই ধরনের সম্পাদন অনুরোধ সমর্থন করে: একবার এবং পর্যায়ক্রমিক। প্রকারের পছন্দ পরিস্থিতির উপর নির্ভর করে: কাজটি একবার চালানো উচিত বা নির্দিষ্ট ব্যবধানে পুনরাবৃত্তি করা উচিত।
OneTimeWorkRequest এমন কাজের জন্য ডিজাইন করা হয়েছে যা একবার সম্পাদন করা উচিত। এটি লগ জমা দেওয়া, প্রমাণীকরণের পরে ডেটা সিঙ্ক্রোনাইজেশন, প্রথম লঞ্চে কনফিগারেশন ডাউনলোড হতে পারে। বিলম্ব setInitialDelay-এর মাধ্যমে এবং সীমাবদ্ধতা setConstraints-এর মাধ্যমে সেট করা হয়।
PeriodicWorkRequest ন্যূনতম 15 মিনিটের ব্যবধানে পুনরাবৃত্ত কাজের জন্য উপযুক্ত। লাইব্রেরি গ্যারান্টি দেয় যে রানের মধ্যে ব্যবধান নির্দিষ্টের চেয়ে কম হবে না, তবে ডিভাইসের সীমাবদ্ধতার কারণে বেশি হতে পারে। 15 মিনিটের কম ফ্রিকোয়েন্সি সহ কাজের জন্য, Foreground Service-এ Handler বা Timer ব্যবহার করুন।
| প্যারামিটার | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| ফ্রিকোয়েন্সি | একবার | পুনরাবৃত্ত (ন্যূনতম 15 মিনিট) |
| সংখ্যা | 1 সম্পাদন | বাতিল না হওয়া পর্যন্ত |
| বিলম্ব | setInitialDelay | setInitialDelay |
| চেইন | সমর্থন করে | না |
| ব্যবহার | ডাউনলোড, সিঙ্ক | মনিটরিং, পোলিং |
WorkManager-এ সীমাবদ্ধতা আপনাকে শর্ত সেট করতে দেয় যার অধীনে একটি কাজ শুরু করা যেতে পারে: নেটওয়ার্ক সংযোগ (NetworkType), ব্যাটারি স্তর (batteryNotLow), স্টোরেজ অবস্থা (StorageNotLow) এবং নিষ্ক্রিয় মোড (DeviceIdle)। সমস্ত সীমাবদ্ধতা পূরণ না হওয়া পর্যন্ত কাজ শুরু হবে না।
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
.setConstraints(constraints)
.build()
চেইন আপনাকে ক্রমিক বা সমান্তরাল কাজ সম্পাদন সংগঠিত করতে দেয়। beginWith একটি চেইন শুরু করে, তারপর পরবর্তী Worker যোগ করে যা আগেরটির সফল সমাপ্তির পরে সম্পাদন করবে। সমান্তরাল সম্পাদনের জন্য, workManager.enqueue(listOf(request1, request2)) ব্যবহার করুন।
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress -> upload -> cleanup ক্রমান্বয়ে
JobScheduler Android 5 (API 21)-এ ব্যাকগ্রাউন্ড কাজ নির্ধারণের জন্য একটি সিস্টেম সার্ভিস হিসেবে চালু করা হয়েছিল। WorkManager এটিকে প্রতিস্থাপন করতে এসেছে, স্বয়ংক্রিয় মাইগ্রেশন এবং অতিরিক্ত ক্ষমতা সহ একটি ক্রস-প্ল্যাটফর্ম API প্রদান করে: চেইন, সম্পাদন গ্যারান্টি, ট্যাগ, LiveData-এর মাধ্যমে অবস্থা পর্যবেক্ষণ।
JobScheduler থেকে WorkManager-এ মাইগ্রেট করার সময়, আপনাকে JobService-কে Worker-এ রূপান্তর করতে হবে, JobInfo-কে WorkRequest-এ এবং Context.getSystemService-কে WorkManager API-তে প্রতিস্থাপন করতে হবে। WorkManager স্বয়ংক্রিয়ভাবে সামঞ্জস্য সমস্যা পরিচালনা করে এবং ম্যানুয়াল JobScheduler বাস্তবায়নের তুলনায় Doze Mode-কে আরও সঠিকভাবে পরিচালনা করে। মাইগ্রেশন ধাপ: 1) Worker ক্লাস তৈরি করুন, 2) একই শর্ত সহ WorkRequest তৈরি করুন, 3) কোড এবং ম্যানিফেস্ট থেকে JobService এবং JobInfo সরান।
WorkManager ExistingWorkPolicy-এর মাধ্যমে অনন্য কাজের ধারণা সমর্থন করে। যদি নির্দিষ্ট নামের একটি কাজ ইতিমধ্যে বিদ্যমান থাকে, নীতি আচরণ নির্ধারণ করে: KEEP (নতুন তৈরি করবেন না), REPLACE (বিদ্যমান প্রতিস্থাপন করুন), APPEND (চেইনের শেষে যোগ করুন) এবং APPEND_OR_REPLACE। UniqueWorkRequest এমন কাজের জন্য সুবিধাজনক যা ডুপ্লিকেট করা উচিত নয়: ডেটাবেস সিঙ্ক্রোনাইজেশন, কনফিগারেশন ডাউনলোড, অ্যানালিটিক্স ব্যাচ জমা।
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
CoroutineWorker setProgress প্রক্রিয়া সমর্থন করে, যা মধ্যবর্তী সম্পাদন ফলাফল পাস করতে দেয়। এটি দীর্ঘস্থায়ী অপারেশনের জন্য দরকারী: বড় ফাইল ডাউনলোড, ব্যাচ ইমেজ প্রসেসিং, ডেটাবেস মাইগ্রেশন। UI getWorkInfosByTagLiveData-এর মাধ্যমে আপডেট সাবস্ক্রাইব করতে এবং রিয়েল-টাইম অগ্রগতি প্রদর্শন করতে পারে। ForegroundInfo পদ্ধতি একটি বিজ্ঞপ্তি সহ Worker-কে Foreground Service হিসেবে চালানোর জন্যও উপলব্ধ যদি কাজটি ব্যবহারকারীর কাছে দৃশ্যমান হওয়া উচিত।
class ProgressWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val total = 100
for (i in 1..total) {
setProgress(
workDataOf("progress" to i)
)
}
return Result.success()
}
}
WorkManager InputData এবং OutputData-এর মাধ্যমে Workers-এর মধ্যে ডেটা স্থানান্তর সমর্থন করে। InputData Data.Builder-এর মাধ্যমে WorkRequest নির্মাণের সময় তৈরি করা হয় এবং inputData-এর মাধ্যমে Worker-এ পাস করা হয়। সম্পাদনের পরে, Worker workDataOf বা Data.Builder-এর মাধ্যমে OutputData তৈরি করে এবং Result.success(outputData)-এর সাথে ফেরত দেয়। চেইনের পরবর্তী Worker পূর্ববর্তীটির outputData নিজের inputData হিসেবে গ্রহণ করে। ডেটা মৌলিক প্রকারের সমর্থন সহ কী-মান ফর্ম্যাটে সংরক্ষণ করা হয়: String, Int, Long, Boolean, Double। সর্বাধিক Data আকার 10 KB।
অনুশীলনে, অনেক প্রকল্প WorkManager-কে একমাত্র ব্যাকগ্রাউন্ড কাজের শিডিউলার হিসেবে ব্যবহার করে। Google সমস্ত বিদ্যমান JobService-কে WorkManager-এ মাইগ্রেট করার পরামর্শ দেয়, বিশেষ করে Android 4.4 (API 19) এবং তার নীচে সমর্থনকারী অ্যাপে, যেখানে JobScheduler উপলব্ধ নয় এবং WorkManager AlarmManager এবং BroadcastReceiver-এর মাধ্যমে একটি ব্যাকআপ প্রক্রিয়া ব্যবহার করে। পরীক্ষার জন্য, WorkManager TestListenableWorkerBuilder এবং TestWorkerBuilder প্রদান করে, যা বাস্তব শিডিউলার ছাড়াই JUnit পরীক্ষায় Workers পরীক্ষা করতে দেয়।
WorkManager পরীক্ষা করতে, AndroidX Test-এর TestListenableWorkerBuilder ব্যবহার করুন, যা Workers-কে একটি বিচ্ছিন্ন পরিবেশে চালাতে এবং ফেরত দেওয়া Result পরীক্ষা করতে দেয়। লাইব্রেরি বাস্তব শিডিউলার ছাড়াই ইউনিট পরীক্ষার জন্য সম্পূর্ণ JUnit এবং Robolectric সমর্থন প্রদান করে। সামগ্রিকভাবে, WorkManager 80% কাজের জন্য উপযুক্ত যেখানে আগে Service বা JobScheduler ব্যবহার করা হত।
সচরাচর জিজ্ঞাসিত প্রশ্ন
হ্যাঁ, WorkManager রিবুটের পরেও সম্পাদনের গ্যারান্টি দেয়। লাইব্রেরি সমস্ত অসম্পূর্ণ কাজ Room ডেটাবেসে সংরক্ষণ করে এবং BroadcastReceiver ব্যবহার করে পুনরুদ্ধার করে যা সিস্টেম বুটের পরে সক্রিয় হয়।
Worker coroutine বা RxJava সমর্থন ছাড়াই ব্যাকগ্রাউন্ড থ্রেডে চলে। CoroutineWorker suspend ফাংশন এবং coroutine scope-এর মাধ্যমে বাতিলকরণের সমর্থন সহ Kotlin coroutines ব্যবহার করে। RxWorker Observable এবং Single-এর সাথে কাজ করে, প্রতিক্রিয়াশীল চেইনের জন্য উপযুক্ত।
বাতিল করতে workManager.cancelWorkById(id) বা workManager.cancelAllWorkByTag("tag") ব্যবহার করুন। লাইব্রেরি নির্দিষ্ট নামের সাথে অনন্য কাজ বাতিল করার জন্য cancelUniqueWork("name") পদ্ধতিও প্রদান করে।
PeriodicWorkRequest-এর জন্য ন্যূনতম ব্যবধান 15 মিনিট। এই সীমা Google দ্বারা অতিরিক্ত ব্যাটারি খরচ রোধ করতে নির্ধারণ করা হয়েছে। যদি একটি কাজ আরও ঘন ঘন চালানোর প্রয়োজন হয়, Foreground Service বা টাইমার সহ Handler ব্যবহার করুন।
হ্যাঁ, WorkManager API 14+ সমর্থন করে। JobScheduler ছাড়া ডিভাইসে (API 21-এর নীচে), লাইব্রেরি কাজ নির্ধারণের জন্য AlarmManager এবং BroadcastReceiver-এর সংমিশ্রণ ব্যবহার করে। এটি WorkManager-কে ব্যাকগ্রাউন্ড কাজের জন্য একটি সর্বজনীন সমাধান করে তোলে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন