WakeLock হল একটি Android প্রক্রিয়া যা CPU বা স্ক্রীন সক্রিয় রেখে ডিভাইসকে স্লিপ মোডে যেতে বাধা দেয়। ফাইল ডাউনলোড, অডিও প্লেব্যাক বা ডেটা রেকর্ডিংয়ের মতো ব্যাকগ্রাউন্ড কাজগুলির বাধাহীন নির্বাহ নিশ্চিত করতে WakeLock প্রয়োজন। Android Developers, 2025 স্পেসিফিকেশন অনুসারে, WakeLock-এর অনুপযুক্ত ব্যবহার ব্যাটারি দ্রুত শেষ করে এবং Google Play-তে অ্যাপ ব্লক হওয়ার কারণ হতে পারে।
মূল পয়েন্ট
WakeLock একটি সিস্টেম লক যা Android-কে ডিভাইসকে কম শক্তি মোডে নিতে বাধা দেয়। সাধারণত, ব্যবহারকারীর নিষ্ক্রিয়তার কয়েক সেকেন্ড পরে, Android স্ক্রীন বন্ধ করে এবং CPU-কে গভীর ঘুমের (deep sleep) অবস্থায় নিয়ে যায়, যার ফলে ব্যাকগ্রাউন্ড থ্রেড স্থগিত হয়। WakeLock CPU সক্রিয় রেখে এই পরিবর্তন রোধ করে।
WakeLock প্রক্রিয়াটি সিস্টেম সার্ভিস PowerManager-এর মাধ্যমে পরিচালিত হয়, যা getSystemService(Context.POWER_SERVICE) পদ্ধতির মাধ্যমে অ্যাক্সেস করা হয়। ডেভেলপার লকের ধরন নির্দিষ্ট করে একটি WakeLock অবজেক্ট তৈরি করে এবং কাজ শেষ হওয়ার পরে এটি নিশ্চিতভাবে মুক্ত করতে হবে, অন্যথায় ডিভাইসের ব্যাটারি দ্রুত শেষ হবে। সিস্টেম স্বয়ংক্রিয়ভাবে WakeLock মুক্ত করে না — এটি অ্যাপের দায়িত্ব।
প্রতিটি প্রধান Android রিলিজের সাথে, Google WakeLock-এর উপর নিয়ন্ত্রণ কঠোর করে। Android 9 (API 28) থেকে শুরু করে, ব্যাকগ্রাউন্ডে থাকা অ্যাপ বৈধ কারণ ছাড়া WakeLock অর্জন করতে পারে না এবং সিস্টেম লকের অপব্যবহারকারী অ্যাপগুলি ট্র্যাক করে এবং জোরপূর্বক সেগুলি মুক্ত করতে পারে। Android 12+-এ ব্যাকগ্রাউন্ড অ্যাপের জন্য PowerManager অ্যাক্সেসে অতিরিক্ত সীমাবদ্ধতা চালু করা হয়েছে।
WakeLock সেই পরিস্থিতিতে প্রয়োজন যেখানে ডিভাইস ঘুমিয়ে গেলে কাজ ব্যাহত হতে পারে না: অস্থির সংযোগে বড় ফাইল ডাউনলোড, ভিডিও রেকর্ডিং, ব্যবহারকারীর মিথস্ক্রিয়া ছাড়া দীর্ঘ গণনা সম্পাদন। স্লিপ লক ছাড়া, CPU গভীর ঘুমে চলে যায়, সমস্ত থ্রেড জমে যায় এবং কাজ অসম্পূর্ণ থেকে যায়।
তবে, Google WakeLock ব্যবহার কমানোর জন্য দৃঢ়ভাবে সুপারিশ করে। বেশিরভাগ ক্ষেত্রে, একই কাজ নোটিফিকেশন সহ Foreground Service, WorkManager বা JobScheduler ব্যবহার করে সমাধান করা যেতে পারে। এই প্রক্রিয়াগুলি ব্যাটারি এবং নেটওয়ার্কের অবস্থা বিবেচনা করে, যা ডিভাইসের ব্যাটারির আয়ু বাড়ায়।
WakeLock PowerManager সিস্টেম সার্ভিসের মাধ্যমে কাজ করে, যা ডিভাইসের পাওয়ার অবস্থা পরিচালনা করে। যখন একটি অ্যাপ powerManager.newWakeLock()-এর মাধ্যমে লকের অনুরোধ করে, সিস্টেম CPU কার্যকলাপের মাত্রা বাড়ায়, গভীর ঘুম রোধ করে। wakeLock.release() কল করার পরে, সিস্টেম স্বাভাবিক শক্তি সঞ্চয় মোডে ফিরে আসে।
এটা বোঝা গুরুত্বপূর্ণ যে WakeLock সমস্ত শক্তি সঞ্চয় মোড প্রতিরোধ করে না। Doze Mode (Android 6+-এর স্লিপ মোড) নির্দিষ্ট ধাপে WakeLock উপেক্ষা করতে পারে — WakeLock ধারণকারী অ্যাপ Doze রক্ষণাবেক্ষণ উইন্ডোর সময় নেটওয়ার্ক অ্যাক্সেস পাবে না। এর অর্থ হল সক্রিয় WakeLock-ও Doze-এর দ্বিতীয় ধাপে নেটওয়ার্ক অপারেশনের নিশ্চয়তা দেয় না।
প্রতিটি WakeLock ফ্রেমওয়ার্ক পাশে PowerManager.WakeLock-এর সাথে যুক্ত। সিস্টেম প্রক্রিয়া স্তরে সক্রিয় লকের গণনা রাখে: যদি একটি প্রক্রিয়া একাধিক WakeLock ধারণ করে, সেগুলি জমা হয় এবং প্রতিটি লকের জন্য release() কল করার পরেই মুক্তি ঘটে। Android ওয়েক লক টাইমআউট-ও সমর্থন করে — নির্দিষ্ট ব্যবধানের পরে স্বয়ংক্রিয় মুক্তি। তবে, টাইমআউটের উপর নির্ভর করা সুপারিশ করা হয় না: কাজ আগে শেষ হতে পারে এবং অতিরিক্ত ধারণ সময় ব্যাটারির আয়ু কমিয়ে দেবে।
যখন ডিভাইস স্লিপ মোডে যায় (পাওয়ার বাটন), Android জোরপূর্বক সমস্ত SCREEN_DIM_WAKE_LOCK এবং SCREEN_BRIGHT_WAKE_LOCK মুক্ত করে কিন্তু PARTIAL_WAKE_LOCK ধরে রাখে। এর অর্থ হল একটি স্ক্রীন লক ডিসপ্লে চালু রাখতে পারে না — শুধুমাত্র PARTIAL_WAKE_LOCK পাওয়ার বাটন চাপার পরে কাজ চালিয়ে যেতে পারে।
Android-এ বিভিন্ন ধরনের WakeLock রয়েছে, প্রতিটি নির্দিষ্ট ডিভাইস উপাদান নিয়ন্ত্রণ করে। প্রকারের পছন্দ নির্ধারণ করে লক করার পরে কোন হার্ডওয়্যার উপাদানগুলি সক্রিয় থাকে। ভুল প্রকার নির্বাচন করলে অপ্রয়োজনীয় মডিউল চালু থাকার কারণে অতিরিক্ত শক্তি খরচ হয়।
| প্রকার | CPU | স্ক্রীন | কীবোর্ড | কখন ব্যবহার করবেন |
|---|---|---|---|---|
| PARTIAL_WAKE_LOCK | চালু | বন্ধ | বন্ধ | ফাইল ডাউনলোড, গণনা |
| SCREEN_DIM_WAKE_LOCK | চালু | ম্লান | বন্ধ | ভিডিও প্লেয়ার, উপস্থাপনা |
| SCREEN_BRIGHT_WAKE_LOCK | চালু | উজ্জ্বল | বন্ধ | গেম (অপ্রচলিত) |
| FULL_WAKE_LOCK | চালু | উজ্জ্বল | উজ্জ্বল | অপ্রচলিত (deprecated) |
PARTIAL_WAKE_LOCK সবচেয়ে বেশি ব্যবহৃত এবং সুপারিশকৃত প্রকার। এটি CPU সক্রিয় রাখে কিন্তু স্ক্রীন এবং কীবোর্ড ব্যাকলাইট বন্ধ করার অনুমতি দেয়। এটি ব্যাকগ্রাউন্ড কাজের জন্য সর্বোত্তম পছন্দ: ডেটা লোডিং, ইমেজ প্রক্রিয়াকরণ, সিঙ্ক্রোনাইজেশন। স্ক্রীন সিস্টেম টাইমআউটের পরে বন্ধ হয়ে যায়, যা ব্যবহারকারীর অদৃশ্য কাজ করার সময় ব্যাটারি বাঁচায়।
SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK এবং FULL_WAKE_LOCK Android 7 (API 24) থেকে অপ্রচলিত। এগুলি স্ক্রীন চালু রাখে, যা উল্লেখযোগ্য ব্যাটারি খরচের কারণ। Google এর পরিবর্তে Activity.getWindow().addFlags()-এর মাধ্যমে FLAG_KEEP_SCREEN_ON ব্যবহার করার সুপারিশ করে — এই ফ্ল্যাগ শুধুমাত্র Activity সক্রিয় থাকলে কাজ করে এবং WAKE_LOCK অনুমতির প্রয়োজন হয় না, যখন সিস্টেম স্বয়ংক্রিয়ভাবে স্ক্রীন ধারণ সময় পরিচালনা করে।
WakeLock Android-এ ব্যাটারির প্রধান গ্রাসকারীদের মধ্যে একটি। স্লিপ লক ধারণের প্রতিটি সেকেন্ড অতিরিক্ত শক্তি খরচ করে কারণ CPU শক্তি-দক্ষ C-state-এ যেতে পারে না। Google Power Dashboard গবেষণা দেখায় যে অনুপযুক্তভাবে মুক্ত করা WakeLock সহ অ্যাপগুলি স্ট্যান্ডবাই মোডে ডিভাইসের শক্তি খরচ 30–50% পর্যন্ত বাড়াতে পারে।
সিস্টেম Battery Historian উপাদানের মাধ্যমে WakeLock-এর অপব্যবহারকারী অ্যাপগুলি ট্র্যাক করে। ডেভেলপার শক্তি খরচ প্রোফাইল বিশ্লেষণ করতে এবং লক লিক সনাক্ত করতে পারে — পরিস্থিতি যেখানে WakeLock তৈরি করা হয়েছে কিন্তু মুক্ত করা হয়নি। Google Play Console প্রকাশিত অ্যাপগুলির জন্য WakeLock পরিসংখ্যান দেখায় এবং উচ্চ ধারণ সময় খারাপ রিভিউর কারণ হতে পারে।
Doze Mode এবং App Standby WakeLock অপারেশন আরও সীমাবদ্ধ করে। প্রথম Doze ধাপে (Light Doze), সিস্টেম ছোট রক্ষণাবেক্ষণ উইন্ডোতে WakeLock অনুমতি দেয়। দ্বিতীয় ধাপে (Deep Doze), WakeLock অন্যান্য লকের সাথে একত্রিত হয় এবং একটি সাধারণ উইন্ডোতে নির্বাহিত হয়। যদি একটি অ্যাপ ব্যবহারকারীর মিথস্ক্রিয়া ছাড়া 10 মিনিটের বেশি WakeLock ধারণ করে, সিস্টেম এটি জোরপূর্বক মুক্ত করতে পারে এবং অ্যাপটিকে ব্যাটারি অপ্টিমাইজেশানের কালো তালিকায় রাখতে পারে।
WakeLock-এর সঠিক ব্যবহার হল কাজ সম্পূর্ণ করার প্রয়োজন এবং ডিভাইসের ব্যাটারির যত্নের মধ্যে ভারসাম্য। Google বেশ কয়েকটি নীতি অনুসরণ করার সুপারিশ করে: সর্বদা finally ব্লকে বা acquire(timeout)-এর মাধ্যমে WakeLock মুক্ত করুন, ন্যূনতম প্রয়োজনীয় লক প্রকার ব্যবহার করুন এবং চরম প্রয়োজন ছাড়া দীর্ঘ ধারণ এড়িয়ে চলুন।
WakeLock একই কোড ব্লকে মুক্ত করা উচিত যেখানে এটি তৈরি করা হয়েছিল। ব্যতিক্রমের ক্ষেত্রে মুক্তি নিশ্চিত করতে try-finally নির্মাণ বা Kotlin-এর use ব্লক ব্যবহার করা হয়। Android 10+-এ, যদি একটি WakeLock 60 সেকেন্ডের বেশি ধারণ করা হয় তবে সিস্টেম logcat-এ একটি সতর্কতা দেখায়: "WakeLock held for more than 60 seconds" — এটি সম্ভাব্য লিকের সংকেত।
acquire(long timeout) পদ্ধতি নির্দিষ্ট মিলিসেকেন্ডের পরে স্বয়ংক্রিয়ভাবে WakeLock মুক্ত করে। এটি ব্যতিক্রম বা বাগের কারণে মুক্তির কোড নির্বাহ না হলে সুরক্ষা প্রদান করে। সর্বাধিক প্রত্যাশিত কাজ নির্বাহ সময় প্লাস 10–20% মার্জিনের সমান একটি টাইমআউট নির্দিষ্ট করার সর্বদা সুপারিশ করা হয়।
release() কল করার আগে, WakeLock বর্তমানে ধারণ করা আছে কিনা তা পরীক্ষা করা উচিত। পূর্ববর্তী acquire() ছাড়া আবার release() কল করলে RuntimeException: WakeLock under-locked হয়। অবস্থা ফ্ল্যাগ (isHeld) সংরক্ষণ এবং মুক্তির আগে wakeLock.isHeld() পরীক্ষা করার সুপারিশ করা হয়।
আসুন Kotlin-এ WakeLock-এর সঠিক তৈরি এবং মুক্তি দেখি। উদাহরণটি PARTIAL_WAKE_LOCK ধারণ করে অ্যাসিঙ্ক্রোনাস ডেটা লোডিং, try-finally ব্লকে নিশ্চিত মুক্তি এবং লিকের বিরুদ্ধে সুরক্ষার জন্য নির্দিষ্ট টাইমআউট প্রদর্শন করে। সার্ভিস ব্যাকগ্রাউন্ড কাজ নির্বাহের জন্য IO ডিসপ্যাচার সহ CoroutineScope ব্যবহার করে।
class DownloadService : Service() {
private lateinit var wakeLock: PowerManager.WakeLock
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
override fun onCreate() {
super.onCreate()
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
"download:wakelock"
)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
wakeLock.acquire(60000)
scope.launch {
try {
downloadFile()
} finally {
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
}
return START_NOT_STICKY
}
private suspend fun downloadFile() {
// ফাইল ডাউনলোডের সিমুলেশন
delay(30000)
}
override fun onDestroy() {
super.onDestroy()
scope.cancel()
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
WakeLock ব্যবহার করতে, AndroidManifest.xml-এ অনুমতি যোগ করতে হবে। WAKE_LOCK অনুমতি একটি সাধারণ অনুমতি — এটি ব্যবহারকারীর কাছ থেকে runtime অনুরোধের প্রয়োজন হয় না এবং অ্যাপ ইনস্টল করার সময় স্বয়ংক্রিয়ভাবে প্রদান করা হয়। তবে, যদি অ্যাপের WakeLock-এর কোনো স্পষ্ট ব্যবহারের ক্ষেত্রে না থাকে তবে Google Play প্রকাশনা প্রত্যাখ্যান করতে পারে।
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.DEVICE_POWER" />
WakeLock একটি নিম্ন-স্তরের প্রক্রিয়া এবং Google যেখানে সম্ভব এটি আরও আধুনিক API দিয়ে প্রতিস্থাপন করার সুপারিশ করে। প্রধান বিকল্প হল নোটিফিকেশন সহ Foreground Service, যা সার্ভিসের সময়কালের জন্য স্বয়ংক্রিয়ভাবে CPU লক ধারণ করে। সিস্টেম Foreground Service-এর জন্য নিজেই WakeLock পরিচালনা করে, ডেভেলপারকে স্পষ্ট অর্জন এবং মুক্তি থেকে মুক্ত করে।
WorkManager ব্যাকগ্রাউন্ড কাজের জন্য দ্বিতীয় গুরুত্বপূর্ণ টুল। এটি ডিভাইস Doze মোডে গেলেও এবং রিবুটের পরেও কাজ নির্বাহের নিশ্চয়তা দেয়। WorkManager অভ্যন্তরীণভাবে হোল্ড লক সমর্থন করে — ডেভেলপারকে PowerManager-এর সাথে স্পষ্টভাবে কাজ করতে হয় না। কাজটি স্বয়ংক্রিয় স্লিপ লক ব্যবস্থাপনা সহ Doze রক্ষণাবেক্ষণ উইন্ডোতে নির্বাহিত হয়।
নির্দিষ্ট সময় প্রয়োজন এমন পুনরাবৃত্ত কাজের জন্য, setAndAllowWhileIdle() সহ AlarmManager ব্যবহার করা হয়, যা ডিভাইসকে Doze থেকে জাগাতে পারে। তবে, AlarmManager শুধুমাত্র ছোট অপারেশনের জন্য উপযুক্ত — এটি দীর্ঘ WakeLock ধারণের জন্য ডিজাইন করা হয়নি। যদি একটি কাজ 10 সেকেন্ডের বেশি সময় নেয়, তাহলে AlarmManager-কে BroadcastReceiver-এর সাথে একত্রিত করুন যা একটি Foreground Service শুরু করে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
WakeLock একটি সিস্টেম লক যা Android ডিভাইসকে স্লিপ মোডে যেতে বাধা দেয়। এটি CPU বা স্ক্রীন সক্রিয় রাখে, ব্যাকগ্রাউন্ড কাজ (ডাউনলোড, গণনা) বাধাহীনভাবে চলতে দেয়। এটি PowerManager সিস্টেম সার্ভিসের মাধ্যমে পরিচালিত হয়।
মূল প্রকারগুলি হল: PARTIAL_WAKE_LOCK (CPU সক্রিয়, স্ক্রীন বন্ধ) — সুপারিশকৃত; SCREEN_DIM_WAKE_LOCK (CPU + ম্লান স্ক্রীন); SCREEN_BRIGHT_WAKE_LOCK (CPU + উজ্জ্বল স্ক্রীন)। SCREEN_DIM, SCREEN_BRIGHT এবং FULL_WAKE_LOCK অপ্রচলিত এবং FLAG_KEEP_SCREEN_ON দ্বারা প্রতিস্থাপিত হয়েছে।
হ্যাঁ, ম্যানিফেস্টে android.permission.WAKE_LOCK ঘোষণা করা প্রয়োজন। এটি একটি সাধারণ অনুমতি যা ইনস্টলেশনের সময় স্বয়ংক্রিয়ভাবে প্রদান করা হয় — এটি runtime-এ চাওয়ার প্রয়োজন নেই। এই অনুমতি ছাড়া, newWakeLock() কল null ফিরিয়ে দেবে অথবা SecurityException নিক্ষেপ করবে।
যদি release() কল না করা হয়, ডিভাইস স্লিপ মোডে যেতে পারে না। ব্যাটারি উল্লেখযোগ্যভাবে দ্রুত শেষ হবে (50% অতিরিক্ত খরচ পর্যন্ত)। সিস্টেম logcat-এ লিক লগ করবে এবং Battery Historian অস্বাভাবিক WakeLock ধারণ সময় দেখাবে, যা খারাপ ব্যবহারকারী রিভিউর দিকে নিয়ে যাবে।
দীর্ঘ কাজের জন্য, নোটিফিকেশন সহ Foreground Service ব্যবহার করুন — সিস্টেম নিজেই WakeLock পরিচালনা করে। বিলম্বিত এবং নিশ্চিত কাজের জন্য, WorkManager ব্যবহার করুন, যা অভ্যন্তরীণভাবে WakeLock সমর্থন করে। ছোট নির্ধারিত কাজের জন্য, AlarmManager ব্যবহার করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন