2012-04-27 8 views
7

Meine Aktivität wird mit einer teilweisen Wecksperre ausgeführt, da sie fortlaufend empfangene Bluetooth-Daten verarbeitet. Die Wake Sperre wird wie so ein:So schalten Sie den Bildschirm während der partiellen Wecksperre ein

powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); 
    wakeLock.acquire(); 

Wenn bestimmte Ereignisse auftreten, mag ich auf dem Display, damit der Benutzer den Status anzeigen kann. Ich möchte das Display automatisch einschalten, nicht durch einen Benutzer Tastendruck. Alle Versuche, dies zu tun, sind jedoch fehlgeschlagen. Wenn sich das Display während der Ausführung einer teilweisen Wecksperre ausschaltet, ist mein Versuch, die Anzeige zurückzuschalten und dem Benutzer die aktuelle Aktivität anzuzeigen, fehlgeschlagen. Ich habe versucht, die Benutzeraktivität fälscht:

PowerManager NewPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    NewPowerManager.userActivity(1, false); 

Setzen von Flags für das Fenster:

Window win = getWindow(); 
    win.setFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

Und selbst die Spur Entriegelungselement und eine andere Start der auf dem Bildschirm drehen sollte:

if (wakeLock != null) 
    { 
     wakeLock.release(); // release the wakelock 
    } 
PowerManager.WakeLock TempWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | 
    PowerManager.ACQUIRE_CAUSES_WAKEUP, "TempWakeLock"); 
    // tried | PowerManager.ON_AFTER_RELEASE to no avail 
    TempWakeLock.acquire(); 

Gibt es etwas, das mir hier fehlt? Ich versuche nicht, eine neue Aktivität zu eröffnen, sondern dem Benutzer lediglich meine aktuelle Aktivität anzuzeigen. Hat jemand anderes das schaffen können? Danke für jede Hilfe, die Sie mir geben können.

Antwort

9

Ich war endlich in der Lage, dieses Problem zu lösen, nachdem ich einen Democode von Lance bei HTC gesehen hatte (danke übrigens).

Das Geheimnis scheint, eine zusätzliche vollständige Wake-Sperre mit ACQUIRE_CAUSES_WAKEUP Set zu erstellen. Ich lasse die ursprüngliche partielle Wecksperre nicht los, aber wenn ich das Display anschalten möchte, erstelle ich die neue vollständige Wecksperre, mache meine Sachen und lasse dann die neue vollständige Wecksperre los. Das funktioniert tatsächlich!

PowerManager TempPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock TempWakeLock = TempPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | 
PowerManager.ON_AFTER_RELEASE, "TempWakeLock"); 
TempWakeLock.acquire(); 

// do the work that needs the visible display... 

// Release the newest wakelock and fall back to the old one 
TempWakeLock.release(); 
Verwandte Themen