PhoneStateListener onSignalStrengthsChanged wird nicht mehr im Service aufgerufen

8

Ich schreibe eine einfache Anwendung mit zwei Elementen - Service und Aktivität. Aktivität wird nur zum Starten und Stoppen des Dienstes verwendet. Der Dienst verwendet PhoneStateListener , um Informationen über aktuelle CellID, LAC und RSSI (Signalstärke) zu erhalten und sie in Datei zu protokollieren.

Alles funktioniert gut, solange das Telefon nicht schläft. Ich habe bemerkt, dass nach dem Ausschalten des Bildschirms und wenigen Minuten Inaktivität mein PhoneStateListener nicht mehr aufgerufen wird. Ich habe versucht, PARTIAL_WAKE_LOCK (und andere Arten von Schlössern) zu meinem Dienst hinzuzufügen, aber ich schätze, es verursacht einen starken Batterieverbrauch und sollte nicht auf diese Weise verwendet werden. Auf der anderen Seite hat es mir nicht wirklich geholfen. Mein anderer Versuch war, Timer zu benutzen und mein PhoneStateListener in bestimmten Abständen heraus zu registrieren / zu registrieren. Unerwarteterweise sieht es so aus, als würde das beim Aktualisieren von CellId und LAC helfen (also denke ich, dass onCellLocationChanged() von meinem Listener aufgerufen wurde), aber die Signalstärke wurde immer noch nicht aktualisiert.

Ich habe nicht versucht, BroadcastReciever zu verwenden, aber nachdem ich etwas in Thema und Themen gelesen habe, glaube ich nicht, dass es für mich funktionieren würde.

Zusammenfassend meine Frage: Warum werden PhoneStateListener -Methoden nicht aufgerufen, wenn das Telefon im Ruhezustand ist? Gibt es einen Weg (wie das Aufwecken oder andere Mechanismen), um dieses Verhalten effizient zu überwinden?

    
mih 05.12.2011, 12:33
quelle

2 Antworten

7

Wenn der Bildschirm aus ist, hört androad auf, Zell- und Signaländerungen zu melden. Dies geschieht, indem URC-Benachrichtigungen auf der RIL-Ebene deaktiviert werden. Soweit ich weiß, können Sie keine Updates erhalten, ohne den Bildschirm einzuschalten. Ein Broadcast-Empfänger würde nicht anders funktionieren.

Wenn es für Sie praktisch ist, würde ich vorschlagen, den Bildschirm einzuschalten, wenn Sie diese Werte überprüfen möchten. Sie können das tun, indem Sie eine Wake-Sperre erwerben und die Flags ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

Bearbeiten: Die erneute Registrierung des Listeners löst zwar die Ausführung der Standortänderung aus, übergibt jedoch nicht die aktuelle Zellinformation, sondern nur die letzte bekannte Zellinformation vor dem Bildschirm aus. Um die aktuellen Zelleninformationen zu erhalten, müssen Sie den Bildschirm weiterhin einschalten.

    
black 19.01.2012 17:53
quelle
1

Anruf am Anfang:

%Vor%

und am Ende:

%Vor%

Sie brauchen die Erlaubnis:

%Vor%     
Bush 13.05.2012 10:02
quelle

Tags und Links