Hat die Android OS-Version ein wakelock, wenn die app oder der Dienst hält er getötet wird?
Ich habe eine Frage zu wakelock. In Fällen, die unten gezeigt wird, hat android OS-Version wakelock (PARTIAL_WAKE_LOCK
wenn Sie angeben müssen) um zu verhindern, dass wakelock übrig war, erworben und verschwenden Akku bis zum ausschalten ausschalten (nicht schlafen).
Fall 1-a:
App erworben hat wakelock (w/o timeout-option) in einem seiner threads (bitte denken Sie es ist vernünftig, in diesem Fall) und es wurde entwickelt, um release-wakelock, wenn kritische Aufgabe fertig war. App können getötet werden durch taskmanager oder berüchtigt taskkiller und app hat keine chance zu lassen, seinen thread release wakelock. Was passiert mit diesem wakelock?
Fall 1-b:
(Wenn die Antwort zu Fall 1-"ja, Mach dir keine sorgen", dann ignorieren Sie bitte diesen Fall.)
Dasselbe wie Fall 1-a, aber-app gab timeout option zu wakelock, sagen wir 3 Sekunden. Ist diese option timeout gehalten gültig?
Fall 2-a:
Bitte stellen Sie sich es ist ein Dienst, der gestartet wurde AlarmManager (über Broadcast-receiver) und der service erworben hat, einen wakelock (w/o timeout-option). Dieser service ist entworfen, um den wakelock-erworben-minimum. Aber leider, Android OS abgeholt, diesen service zu töten, aufgrund von Speicher-crunch. (Ich weiß nicht, ob OS nicht töten-service, wenn wakelock erworben, aber ich denke, OS egal ist. Aber ich hoffe, das OS release wakelock später.) Was passiert mit diesem wakelock?
Fall 2-b:
(Wenn die Antwort zu Fall 2-ein "ja, Mach dir keine sorgen", dann ignorieren Sie bitte diesen Fall.)
Dasselbe wie Fall 2-a, aber service gab timeout option zu wakelock, sagen wir 3 Sekunden. Ist diese option timeout gehalten gültig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
WakeLock Übersicht Über Die Implementierung
Wenn wir
pm.newWakeLock
zum erstellen einer neuen wakelock, derPowerManager
erstellt einfach eine neue WakeLock-Objekt und gibt. WakeLock-Objekt ist nicht ein binder-Objekt, so kann es nicht verwendet werden, die durch mehrere Prozesse. Jedoch, in diesem WakeLock-Objekt, es enthält ein Binder-Objekt mit dem Namen mToken.So, wenn Sie anrufen, Erwerb oder Veröffentlichung auf dieser WakeLock-Objekt, es eigentlich geht, die token zu
PowerManagerService
.Schauen, wie
PowerManagerService
funktioniert, wenn der Erwerb oder die Freigabe eines wakelock wird Ihnen helfen, Ihre Frage zu beantworten.Die key-Anweisung ist die
lock.linkToDeath(wakeLock, 0);
. Dasslock
ist genau die mToken wir bereits erwähnt. Diese Methode registriert den Empfänger (diewakeLock
) für eine Benachrichtigung, wenn das Bindemittel verschwindet. Wenn das binder-Objekt unerwartet geht Weg (in der Regel, weil Ihre hosting-Prozess getötet wurde), dann diebinderDied
Methode wird aufgerufen, auf den Empfänger.Beachten Sie, dass das WakeLock in
PowerManagerService
unterscheidet sich von der WakeLock inPowerManager
es ist eine Implementierung vonIBinder.DeathRecipient
. So überprüfen Sie IhrebinderDied
Methode.Den
handleWakeLockDeath
release wird, dass wakelock.So, ich denke, in beiden Fällen in Ihrer Frage, die Antwort ist, Mach dir keine sorgen. Zumindest in Android 4.2 (wo der code stammt), es ist wahr. Darüber hinaus gibt es eine finalize-Methode auf WakeLock-Klasse in
PowerManager
, aber das ist nicht der Schlüssel zu Ihrer Frage.Ich würde davon ausgehen (ich weiß nicht, dies für sicher) ist das Android-system nicht zu halten wakelocks für getöteten Prozesse. Wahrscheinlich, wenn es tötet den Prozess mit sigkill es entfernt auch alle wakelocks gehalten durch diesen Prozess.
Sonst, wie du sagst, stürzt ab, würde dazu führen, dass das Handy immer wach, die ich so noch nicht beobachtet.