2015-05-14 11 views
19

Chciałbym, aby moja aplikacja mogła włączyć ekran i wyświetlić moją aplikację. Załóżmy, że ustawiam alarm i co godzinę chcę, aby moja aplikacja była wyświetlana przez 2 minuty, zanim urządzenie w naturalny sposób zasnął.Włączanie ekranu od odbiornika/usługi

Widzę, że WakeLock (FU_L_LOCK) i KeyguardManager są przestarzałe.

Stworzyłem WakefulBroadcastReceiver i usługę, a one działają.

@Override 
protected void onHandleIntent(Intent intent) { 
    // I need to show the screen here! 

    for (int i=0; i<5; i++) { 
     Log.i("SimpleWakefulReceiver", "Running service " + (i + 1) 
       + "/5 @ " + SystemClock.elapsedRealtime()); 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
     } 
    } 
    Log.i("SimpleWakefulReceiver", "Completed service @ " + 
      SystemClock.elapsedRealtime()); 
    SimpleWakefulReceiver.completeWakefulIntent(intent); 
} 

Jak programowo włączyć ekran, uzyskać przeszłości blokady i wyświetlić moją aktywność od IntentService?

Dzięki

+0

"Widzę, że WakeLock i KeyguardManager są przestarzałe." dodaj link: –

+0

PEŁNA blokada: http://developer.android.com/reference/android/os/PowerManager.html#FULL_WAKE_LOCK i http://developer.android.com/reference/android/app/KeyguardManager .KeyguardLock.html – RuAware

Odpowiedz

24

Możesz użyć tego kodu, aby włączyć ekran.

lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE); 
powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE)); 
wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG"); 

lock.disableKeyguard(); 
wake.acquire(); 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
       | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
       | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 

potrzebne następujące uprawnienia w pliku AndroidManifest.xml:

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

edycji (używać ten jeden, nic nie jest przestarzałe):
Jest jeszcze jedna alternatywa dla tej operacji, w tym celu należy uruchomić działanie, W działaniu onCreate() należy dodać flagi do okna. Na przykład:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);` 
} 
+0

Dzięki, ale proszę zauważyć, że PowerManager.FULL_WAKE_LOCK amd Keyguard są amortyzowane. Chcę aplikację, która po usunięciu tego nadal działa. WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD zabierze Cię po klawiaturze. ale nadal trzeba obudzić wyświetlacz. – RuAware

+1

Jest jeszcze jedna alternatywa, aby to zrobić, ponieważ musisz uruchomić działanie, W działaniu onCreate() musisz dodać flagi do okna., A FLAG_DISMISS_KEYGUARD nie jest przestarzałe. . getWindow() addFlags (WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); – Kartheek

+0

dziękuję, uruchamiając nową czynność za pomocą tych ustawień, jeśli umieścisz to jako rozwiązanie, oznaczę to jako poprawne. – RuAware

2

nie wiem, co mówisz, blokada wybudzenia nie jest zdecydowanie przestarzała. Pewne typy nie są już preferowanym przez Google sposobem robienia rzeczy, ale normalne wakelocks wciąż istnieją i wciąż jest to najłatwiejszy sposób na zrobienie tego. Podczas blokowania pamiętaj, aby dodać flagę ACQUIRE_CAUSES_WAKEUP. W rzeczywistości zauważ, że WakefulBroadcastReceiver jest realizowany za pomocą wakelocks.

+0

Mogę obudzić ekran za pomocą PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP Ale PowerManager.FULL_WAKE_LOCK amortyzowane 17. Wraz z KeyguardManager, po prostu patrząc na właściwej drodze, aby to zrobić teraz – RuAware

1

Możesz użyć tego kodu, aby włączyć ekran.

private void turnScreenOn() { 
    int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; 
    getWindow().addFlags(flags); 
} 

Możesz użyć tego kodu, aby go włączyć, dopóki blokada wybudzania nie zostanie zmieniona.

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

private PowerManager mPowerManager; 
private PowerManager.WakeLock mWakeLock; 

@Override 
public void onCreate() { 
super.onCreate(); 
    mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Service"); 
} 

private void acquireWakeLock() { 
    try { 
     mWakeLock.acquire(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void releaseWakeLock() { 
    try { 
     mWakeLock.release(); 
    } 
    catch (Exception e) { 

    } 
} 
+0

Dziękuję, czuję się jakbym się gdzieś i mieć coś podobnego, ale PowerManager.SCREEN_DIM_WAKE_LOCK dodany jest amortyzowany wraz z JASNYM i PEŁNYM musisz również upewnić się, że dodajesz flagi na UIthread tak wypróbowane Odbierz msg -> uruchom na ui dodaj keep_screen_on -> uzyskaj częściową blokadę z Odzyskaj przebudzenia. Ale to nie włącza ekranu, tylko myśl, że to jest zamortyzowane paramery – RuAware

+0

czy wypróbowałeś funkcję turnScreenOn?Ten, którego użyłem w odbiorniku komunikatów GCM, jeśli odebrano określony typ wiadomości (oparty na priorytecie) –

+0

tak, bez wkładania w uithread dostaję "Tylko oryginalny wątek, który utworzył hierarchię widoku, może dotykać swoich widoków." ale nadal nie włącza głupiego ekranu! w przypadku jakiejkolwiek zdeprecjonowanej opcji wydaje mi się, że planują coś zabrać i nie dają nam na to sposobu. – RuAware

Powiązane problemy