WakeLock: τι είναι, τύποι και διαχείριση κλειδώματος ύπνου

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-28 Χρόνος ανάγνωσης: 9 λεπ

Το WakeLock είναι ένας μηχανισμός Android που εμποδίζει τη μετάβαση της συσκευής σε λειτουργία ύπνου, διατηρώντας τον επεξεργαστή ή την οθόνη σε ενεργή κατάσταση. Οι εργασίες παρασκηνίου, όπως η λήψη αρχείων, η αναπαραγωγή ήχου ή η εγγραφή δεδομένων, απαιτούν WakeLock για εγγυημένη εκτέλεση χωρίς διακοπές. Σύμφωνα με την προδιαγραφή Android Developers, 2025, η λανθασμένη χρήση του WakeLock οδηγεί σε γρήγορη αποφόρτιση της μπαταρίας και μπορεί να προκαλέσει τον αποκλεισμό της εφαρμογής στο Google Play.

Κύρια Σημεία

  • WakeLock — κλείδωμα ύπνου, που διατηρεί τη συσκευή σε ενεργή κατάσταση
  • Τύποι — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK και άλλοι
  • Άδεια — WAKE_LOCK απαιτείται στο manifest, αλλά δεν ζητείται κατά το runtime
  • Κίνδυνοι — το μη απελευθερωμένο WakeLock αποφορτίζει την μπαταρία και υποβαθμίζει την εμπειρία χρήστη
  • Εναλλακτικές — WorkManager, Foreground Service, JobScheduler μειώνουν την ανάγκη για WakeLock

Τι είναι το WakeLock

WakeLock είναι ένα κλείδωμα συστήματος που απαγορεύει στο Android να μεταφέρει τη συσκευή σε λειτουργία χαμηλής κατανάλωσης ενέργειας. Συνήθως το Android μετά από μερικά δευτερόλεπτα αδράνειας του χρήστη απενεργοποιεί την οθόνη και μεταφέρει τον επεξεργαστή σε κατάσταση βαθύ ύπνου (deep sleep), όπου τα νήματα παρασκηνίου αναστέλλονται. Το WakeLock εμποδίζει αυτή τη μετάβαση, διατηρώντας την CPU σε ενεργή κατάσταση.

Ο μηχανισμός WakeLock διαχειρίζεται μέσω της υπηρεσίας συστήματος PowerManager, στην οποία γίνεται πρόσβαση μέσω της μεθόδου getSystemService(Context.POWER_SERVICE). Ο προγραμματιστής δημιουργεί ένα αντικείμενο WakeLock καθορίζοντας τον τύπο κλειδώματος και πρέπει να το απελευθερώσει εγγυημένα μετά την ολοκλήρωση της εργασίας, διαφορετικά η μπαταρία της συσκευής θα αποφορτιστεί γρήγορα. Το σύστημα δεν απελευθερώνει το WakeLock αυτόματα — αυτή είναι ευθύνη της εφαρμογής.

Με κάθε μεγάλη έκδοση Android, η Google αυστηροποιεί τον έλεγχο του WakeLock. Ξεκινώντας από Android 9 (API 28), μια εφαρμογή στο παρασκήνιο δεν μπορεί να αποκτήσει WakeLock χωρίς σοβαρό λόγο, και το σύστημα παρακολουθεί εφαρμογές που κάνουν κατάχρηση των κλειδωμάτων και μπορεί να τα απελευθερώσει αναγκαστικά. Στο Android 12+ εισήχθησαν πρόσθετοι περιορισμοί στην πρόσβαση στο PowerManager για εφαρμογές παρασκηνίου.

Πότε είναι απαραίτητο το WakeLock

WakeLock απαιτείται σε σενάρια όπου η εργασία δεν μπορεί να διακοπεί από τη μετάβαση της συσκευής σε ύπνο: λήψη μεγάλου αρχείου μέσω ασταθούς σύνδεσης, εγγραφή βίντεο, εκτέλεση μεγάλων υπολογισμών χωρίς συμμετοχή χρήστη. Χωρίς κλείδωμα ύπνου, ο επεξεργαστής εισέρχεται σε βαθύ ύπνο, όλα τα νήματα (threads) παγώνουν και η εργασία παραμένει ημιτελής.

Ωστόσο, η Google συνιστά ανεπιφύλακτα την ελαχιστοποίηση της χρήσης WakeLock. Στις περισσότερες περιπτώσεις, η ίδια εργασία μπορεί να λυθεί με Foreground Service με ειδοποίηση, WorkManager ή JobScheduler. Αυτοί οι μηχανισμοί λαμβάνουν υπόψη την κατάσταση της μπαταρίας και του δικτύου, γεγονός που παρατείνει τη διάρκεια ζωής της μπαταρίας της συσκευής.

Πώς λειτουργεί το WakeLock

WakeLock λειτουργεί μέσω της υπηρεσίας συστήματος PowerManager που διαχειρίζεται την κατάσταση τροφοδοσίας της συσκευής. Όταν η εφαρμογή ζητά κλείδωμα μέσω powerManager.newWakeLock(), το σύστημα αυξάνει το επίπεδο δραστηριότητας της CPU, εμποδίζοντας τη μετάβαση σε βαθύ ύπνο. Μετά την κλήση wakeLock.release(), το σύστημα επιστρέφει στην κανονική λειτουργία εξοικονόμησης ενέργειας.

Είναι σημαντικό να κατανοήσετε ότι το WakeLock δεν εμποδίζει όλες τις λειτουργίες εξοικονόμησης ενέργειας. Doze Mode (λειτουργία ύπνου Android 6+) μπορεί να αγνοήσει το WakeLock σε ορισμένες φάσεις — η εφαρμογή με διατηρούμενο WakeLock δεν θα έχει πρόσβαση στο δίκτυο στα παράθυρα συντήρησης Doze. Αυτό σημαίνει ότι ακόμη και ένα ενεργό WakeLock δεν εγγυάται την εκτέλεση λειτουργιών δικτύου κατά τη δεύτερη φάση Doze.

Κάθε WakeLock συνδέεται με PowerManager.WakeLock στην πλευρά του πλαισίου. Το σύστημα διατηρεί καταμέτρηση ενεργών κλειδωμάτων σε επίπεδο διεργασίας: εάν μία διεργασία διατηρεί πολλά WakeLock, αθροίζονται και η απελευθέρωση γίνεται μόνο μετά την κλήση release() για κάθε κλείδωμα. Το Android υποστηρίζει επίσης wake lock timeouts — αυτόματη απελευθέρωση μετά από καθορισμένο διάστημα. Ωστόσο, η εμπιστοσύνη στο timeout δεν συνιστάται: η εργασία μπορεί να ολοκληρωθεί νωρίτερα και ο επιπλέον χρόνος διατήρησης θα μειώσει τη διάρκεια ζωής της μπαταρίας.

WakeLock και συμβάντα συστήματος

Κατά τη μετάβαση της συσκευής σε λειτουργία ύπνου (κουμπί λειτουργίας), το Android απελευθερώνει αναγκαστικά όλα τα SCREEN_DIM_WAKE_LOCK και SCREEN_BRIGHT_WAKE_LOCK, αλλά διατηρεί το PARTIAL_WAKE_LOCK. Αυτό σημαίνει ότι το κλείδωμα οθόνης δεν μπορεί να εμποδίσει τη συσκευή να απενεργοποιήσει την οθόνη — μόνο το PARTIAL_WAKE_LOCK μπορεί να συνεχίσει να λειτουργεί μετά το πάτημα του κουμπιού λειτουργίας.

Τύποι WakeLock στο Android

Στο Android υπάρχουν διάφοροι τύποι WakeLock, καθένας από τους οποίους διαχειρίζεται συγκεκριμένα στοιχεία της συσκευής. Η επιλογή τύπου καθορίζει ποια στοιχεία υλικού παραμένουν ενεργά μετά το κλείδωμα. Η λανθασμένη επιλογή τύπου οδηγεί σε υπερβολική κατανάλωση ενέργειας λόγω ενεργοποίησης περιττών μονάδων.

ΤύποςCPUΟθόνηΠληκτρολόγιοΠότε να χρησιμοποιηθεί
PARTIAL_WAKE_LOCKΕνεργόΑπενεργόΑπενεργόΛήψη αρχείων, υπολογισμοί
SCREEN_DIM_WAKE_LOCKΕνεργόΑμυδρόΑπενεργόΠρόγραμμα αναπαραγωγής βίντεο, παρουσίαση
SCREEN_BRIGHT_WAKE_LOCKΕνεργόΦωτεινήΑπενεργόΠαιχνίδια (παρωχημένο)
FULL_WAKE_LOCKΕνεργόΦωτεινήΦωτεινόΠαρωχημένο (deprecated)

PARTIAL_WAKE_LOCK — ο κύριος τύπος

PARTIAL_WAKE_LOCK είναι ο πιο συχνά χρησιμοποιούμενος και συνιστώμενος τύπος. Διατηρεί την CPU ενεργή, αλλά επιτρέπει την απενεργοποίηση της οθόνης και του φωτισμού πληκτρολογίου. Αυτή είναι η βέλτιστη επιλογή για εργασίες παρασκηνίου: λήψη δεδομένων, επεξεργασία εικόνων, συγχρονισμός. Η οθόνη σβήνει μετά τη λήξη του χρονικού ορίου συστήματος, εξοικονομώντας μπαταρία κατά την εκτέλεση αόρατης για τον χρήστη εργασίας.

Παρωχημένοι τύποι (deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK και FULL_WAKE_LOCK έχουν χαρακτηριστεί ως παρωχημένοι από το Android 7 (API 24). Διατηρούν την οθόνη αναμμένη, γεγονός που οδηγεί σε σημαντική κατανάλωση μπαταρίας. Η Google συνιστά να χρησιμοποιείται αντ' αυτών το FLAG_KEEP_SCREEN_ON μέσω Activity.getWindow().addFlags() — αυτή η σημαία λειτουργεί μόνο με ενεργή Activity και δεν απαιτεί άδεια WAKE_LOCK, ενώ το σύστημα διαχειρίζεται αυτόματα τον χρόνο διατήρησης της οθόνης.

WakeLock και κατανάλωση ενέργειας

WakeLock είναι ένας από τους κύριους «καταναλωτές» μπαταρίας στο Android. Κάθε δευτερόλεπτο διατήρησης του κλειδώματος ύπνου καταναλώνει επιπλέον ενέργεια, επειδή ο επεξεργαστής δεν μπορεί να μεταβεί στην ενεργειακά αποδοτική κατάσταση C-state. Η έρευνα του Google Power Dashboard δείχνει ότι εφαρμογές με λανθασμένα απελευθερωμένα WakeLock μπορούν να αυξήσουν την κατανάλωση ενέργειας της συσκευής κατά 30–50% σε κατάσταση αναμονής.

Το σύστημα παρακολουθεί εφαρμογές που κάνουν κατάχρηση του WakeLock μέσω του στοιχείου Battery Historian. Ο προγραμματιστής μπορεί να αναλύσει το προφίλ κατανάλωσης ενέργειας και να εντοπίσει «διαρροές» κλειδωμάτων — καταστάσεις όπου το WakeLock δημιουργήθηκε αλλά δεν απελευθερώθηκε. Η Google Play Console εμφανίζει στατιστικά WakeLock για δημοσιευμένες εφαρμογές και ο μεγάλος χρόνος διατήρησης μπορεί να οδηγήσει σε κακές κριτικές.

Doze Mode και App Standby περιορίζουν περαιτέρω τη λειτουργία του WakeLock. Στην πρώτη φάση Doze (Light Doze), το σύστημα επιτρέπει το WakeLock σε σύντομα παράθυρα συντήρησης. Στη δεύτερη φάση (Deep Doze), το WakeLock συνδυάζεται με άλλα κλειδώματα και εκτελείται σε κοινό παράθυρο. Εάν η εφαρμογή διατηρεί WakeLock για περισσότερο από 10 λεπτά χωρίς αλληλεπίδραση χρήστη, το σύστημα μπορεί να το απελευθερώσει αναγκαστικά και να τοποθετήσει την εφαρμογή στη μαύρη λίστα βελτιστοποίησης μπαταρίας.

  • Battery Historian — εργαλείο για ανάλυση κατανάλωσης ενέργειας και διαρροών WakeLock
  • Doze Mode — περιορίζει το WakeLock σε παράθυρα συντήρησης, συνδυάζοντας κλειδώματα
  • Google Play Console — εμφανίζει στατιστικά WakeLock για δημοσιευμένες εφαρμογές
  • Μαύρη λίστα — η εφαρμογή μπορεί να επισημανθεί από το σύστημα ως ενεργοβόρα

Βέλτιστες πρακτικές χρήσης

Η σωστή χρήση του WakeLock είναι μια ισορροπία μεταξύ της ανάγκης εκτέλεσης μιας εργασίας και της φροντίδας για την μπαταρία της συσκευής. Η Google συνιστά να ακολουθείτε μερικές αρχές: να απελευθερώνετε πάντα το WakeLock στο finally ή μέσω acquire(timeout), να χρησιμοποιείτε τον ελάχιστα απαραίτητο τύπο κλειδώματος και να αποφεύγετε την παρατεταμένη διατήρηση χωρίς επιτακτική ανάγκη.

Κανόνας απελευθέρωσης

WakeLock πρέπει να απελευθερώνεται στο ίδιο μπλοκ κώδικα όπου δημιουργήθηκε. Για εγγυημένη απελευθέρωση σε περιπτώσεις εξαιρέσεων, χρησιμοποιείται η δομή try-finally ή το μπλοκ use της Kotlin. Σε Android 10+, το σύστημα εμφανίζει προειδοποίηση στο logcat εάν το WakeLock διατηρείται για περισσότερο από 60 δευτερόλεπτα: "WakeLock held for more than 60 seconds" — αυτό είναι σήμα πιθανής διαρροής.

Χρονικό όριο κατά τη λήψη

Η μέθοδος acquire(long timeout) απελευθερώνει αυτόματα το WakeLock μετά από καθορισμένο χρόνο σε χιλιοστά του δευτερολέπτου. Αυτό είναι ένα δίχτυ ασφαλείας σε περίπτωση που ο κώδικας απελευθέρωσης δεν εκτελεστεί λόγω εξαίρεσης ή σφάλματος. Συνιστάται να ορίζετε πάντα ένα χρονικό όριο ίσο με τον μέγιστο αναμενόμενο χρόνο εκτέλεσης της εργασίας συν 10–20% περιθώριο.

Έλεγχος ύπαρξης κλειδώματος

Πριν από την κλήση release(), θα πρέπει να ελέγχετε εάν το WakeLock διατηρείται εκείνη τη στιγμή. Η επαναλαμβανόμενη κλήση release() χωρίς προηγούμενο acquire() προκαλεί RuntimeException: WakeLock under-locked. Συνιστάται η αποθήκευση μιας σημαίας κατάστασης (isHeld) και πριν από την απελευθέρωση ο έλεγχος wakeLock.isHeld().

Χρήση WakeLock σε Kotlin

Ας εξετάσουμε τη σωστή δημιουργία και απελευθέρωση του WakeLock σε Kotlin. Το παράδειγμα δείχνει ασύγχρονη λήψη δεδομένων με διατήρηση PARTIAL_WAKE_LOCK, εγγυημένη απελευθέρωση στο μπλοκ try-finally και καθορισμό χρονικού ορίου για προστασία από διαρροές. Η υπηρεσία χρησιμοποιεί CoroutineScope με dispatcher IO για την εκτέλεση της εργασίας παρασκηνίου.

kotlin
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
}

Δήλωση άδειας στο manifest

Για τη χρήση του WakeLock πρέπει να προστεθεί άδεια στο AndroidManifest.xml. Η άδεια WAKE_LOCK είναι κανονική (normal) — δεν απαιτεί αίτηση runtime από τον χρήστη και χορηγείται αυτόματα κατά την εγκατάσταση της εφαρμογής. Ωστόσο, το Google Play μπορεί να απορρίψει τη δημοσίευση εάν η εφαρμογή δεν έχει προφανές σενάριο χρήσης WakeLock.

xml
<uses-permission
    android:name="android.permission.WAKE_LOCK" />

<uses-permission
    android:name="android.permission.DEVICE_POWER" />

Εναλλακτικές για το WakeLock

WakeLock είναι ένας μηχανισμός χαμηλού επιπέδου και η Google συνιστά, όπου είναι δυνατόν, να αντικαθίσταται με πιο σύγχρονα API. Η κύρια εναλλακτική είναι το Foreground Service με ειδοποίηση, το οποίο διατηρεί αυτόματα το κλείδωμα CPU κατά τη διάρκεια λειτουργίας της υπηρεσίας. Το σύστημα διαχειρίζεται το ίδιο το WakeLock για το Foreground Service, απαλλάσσοντας τον προγραμματιστή από την ανάγκη ρητής λήψης και απελευθέρωσης.

WorkManager είναι το δεύτερο σημαντικότερο εργαλείο για εργασίες παρασκηνίου. Εγγυάται την εκτέλεση εργασίας ακόμη και όταν η συσκευή μεταβαίνει σε Doze και μετά από επανεκκίνηση. Το WorkManager υποστηρίζει διατήρηση κλειδώματος (hold lock) εσωτερικά — ο προγραμματιστής δεν χρειάζεται να εργάζεται ρητά με το PowerManager. Η εργασία εκτελείται στο παράθυρο συντήρησης Doze με αυτόματη διαχείριση του κλειδώματος ύπνου.

Για τακτικές εργασίες που απαιτούν ακριβή χρόνο, χρησιμοποιείται AlarmManager με setAndAllowWhileIdle(), το οποίο μπορεί να αφυπνίσει τη συσκευή από το Doze. Ωστόσο, το AlarmManager είναι κατάλληλο μόνο για σύντομες λειτουργίες — δεν έχει σχεδιαστεί για παρατεταμένη διατήρηση WakeLock. Εάν η εργασία διαρκεί περισσότερο από 10 δευτερόλεπτα, το AlarmManager πρέπει να συνδυαστεί με BroadcastReceiver που εκκινεί το Foreground Service.

  • Foreground Service — αυτόματη διαχείριση WakeLock με ειδοποίηση
  • WorkManager — εγγυημένη εκτέλεση λαμβάνοντας υπόψη Doze και επανεκκίνηση
  • JobScheduler — προγραμματισμός λαμβάνοντας υπόψη δίκτυο, φόρτιση και αδράνεια
  • AlarmManager — αφύπνιση συσκευής για σύντομες εργασίες βάσει προγράμματος

Συχνές Ερωτήσεις

Τι είναι το WakeLock στο Android;

WakeLock είναι ένα κλείδωμα συστήματος που εμποδίζει τη συσκευή Android να εισέλθει σε λειτουργία ύπνου. Διατηρεί τον επεξεργαστή ή την οθόνη ενεργή, επιτρέποντας σε εργασίες παρασκηνίου (λήψεις, υπολογισμοί) να εκτελούνται χωρίς διακοπή. Διαχειρίζεται μέσω της υπηρεσίας συστήματος PowerManager.

Ποιοι τύποι WakeLock υπάρχουν;

Κύριοι τύποι: 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.

Χρειάζεται άδεια για το WakeLock;

Ναι, στο manifest πρέπει να δηλωθεί το android.permission.WAKE_LOCK. Είναι κανονική άδεια (normal permission) που χορηγείται αυτόματα κατά την εγκατάσταση — δεν χρειάζεται να ζητηθεί κατά το runtime. Χωρίς αυτήν την άδεια, η κλήση newWakeLock() επιστρέφει null ή προκαλεί SecurityException.

Τι συμβαίνει εάν δεν απελευθερωθεί το WakeLock;

Εάν δεν κληθεί release(), η συσκευή δεν μπορεί να εισέλθει σε λειτουργία ύπνου. Η μπαταρία θα αποφορτιστεί σημαντικά πιο γρήγορα (έως 50% επιπλέον κατανάλωση). Το σύστημα θα καταγράψει τη διαρροή στο logcat και το Battery Historian θα δείξει ανώμαλο χρόνο διατήρησης WakeLock, οδηγώντας σε αρνητικές κριτικές χρηστών.

Με τι να αντικαταστήσω το WakeLock σε σύγχρονες εφαρμογές;

Για μεγάλες εργασίες, χρησιμοποιήστε Foreground Service με ειδοποίηση — το σύστημα διαχειρίζεται το ίδιο το WakeLock. Για αναβληθείσες και εγγυημένες εργασίες, χρησιμοποιήστε WorkManager, το οποίο υποστηρίζει εσωτερικά το WakeLock. Για σύντομες προγραμματισμένες εργασίες — AlarmManager.

Σύνοψη

  • WakeLock — κλείδωμα ύπνου, που διατηρεί την CPU ή την οθόνη της συσκευής Android ενεργή
  • PARTIAL_WAKE_LOCK — κύριος τύπος για εργασίες παρασκηνίου, οθόνη απενεργοποιημένη, CPU παραμένει ενεργή
  • Άδεια — WAKE_LOCK στο manifest (normal permission, runtime δεν απαιτείται)
  • Διαρροές — μη απελευθερωμένο WakeLock αποφορτίζει μπαταρία 30–50%, απελευθερώστε σε finally ή με timeout
  • Παρωχημένο — SCREEN_DIM, SCREEN_BRIGHT και FULL_WAKE_LOCK αντικαταστάθηκαν από FLAG_KEEP_SCREEN_ON
  • Foreground Service — εναλλακτική με αυτόματη διαχείριση WakeLock και ειδοποίηση
  • WorkManager — καλύτερη επιλογή για αναβληθείσες εργασίες παρασκηνίου με εγγυημένη εκτέλεση

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης