2013-05-02 2 views
3

Je crée l'application où un lancement d'activité est planifié par AlarmManager. Je voudrais apparaître même si l'écran est éteint et l'appareil est verrouillé.Android allume l'écran

Pour un ensemble ce ACHIVE les drapeaux de fenêtre

final Window win = getWindow(); 
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
     | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
     | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
     | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 

et essayer d'obtenir pour l'écran de verrouillage

if(_lock == null) 
{ 
    PowerManager pm = (PowerManager)App.getAppContext() 
      .getSystemService(Context.POWER_SERVICE); 

    _lock = pm.newWakeLock(
      PowerManager.FULL_WAKE_LOCK, "ScreenOn"); 
    _lock.acquire(); 
} 

Le _lock est PowerManager.WakeLock qui est libéré dans OnPause

protected void onPause() 
{ 
    if(_lock != null) 
    { 
      _lock.release(); 
    } 
} 

Ce code est exécuté dans onCreate et onRestart. Tout fonctionne bien si l'activité n'est pas encore lancée. Mais s'il a été lancé plus tôt, l'écran n'est pas éteint.

  • onRestart est appelé en premier
  • onResume est alors appelé
  • OnPause est appelée immédiatement

Ainsi, l'activité ne démarre pas. Ma question est de savoir comment allumer l'écran dans une telle situation. (J'utilise API 15).

+0

Publiez plus de votre code - tout cela. Quoi - où est _lock? et vous voulez probablement dire "l'écran n'est pas allumé *** sur ***" –

+0

Alors le verrou est un _private static member_? Êtes-vous sûr que _Everything fonctionne bien si l'activité n'est pas encore lancée_? Même lorsque le téléphone est alsep? Essayez d'augmenter l'heure d'alarme initiale - je parie que l'activité ne fonctionnera pas. Quand je dis plus de code, je veux dire aussi l'alarme et le récepteur pour l'alarme - vous utilisez un récepteur pour l'ararm non? Et _again, vous voulez probablement dire "l'écran n'est pas activé ** sur **" _ –

Répondre

0

Il suffit d'utiliser votre code:

final Window win = getWindow(); 
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
     | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

dans onCreate() seulement et enlever toutes les autres méthodes d'activité-cycle si elles ne font rien d'autre que cela.

Je ne pense pas que vous ayez besoin de plus de code pour l'utiliser.

+0

Cela fonctionne parfaitement seulement la première fois. Mais quand je mettrai cette activité à l'arrière-plan la prochaine fois, elle ne fera rien. – Seagull

2

je suis venu avec la solution. J'ai créé une nouvelle activité qui va essayer d'allumer l'écran dans le onCreate() puis attendre jusqu'à ce qu'il soit allumé. Lorsque l'écran est ok il lancera l'activité qui devrait être affichée. Pour Android toujours créer cette activité

public class TurnOnScreen extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     if (pm.isScreenOn()) openActivity(); 
     else { 
      registerReceiver(mScreenOnReceiver, new IntentFilter(
        Intent.ACTION_SCREEN_ON)); 
      reciever_registered = true; 
      turnScreenOn(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (reciever_registered) { 
      unregisterReceiver(mScreenOnReceiver); 
      reciever_registered = false; 
     } 
    } 

    private boolean reciever_registered = false; 
    private final BroadcastReceiver mScreenOnReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      openActivity(); 
     } 
    }; 

    private void openActivity() { 
     Intent intent = new Intent(); 
     // .... 
     finish(); 
    } 

    private void turnScreenOn() { 
     final Window win = getWindow(); 
     win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
       | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
     win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 
    } 
} 

Je cherche toujours des explications pourquoi l'écran est pas activée dans onRestart.

+0

Vous devriez déplacer votre code dans 'onResume' et vous désinscrire sur' onPause' –

+0

Il semble ne pas fonctionner si je mets ce code dans onResume. – Seagull

+0

Je veux dire le code du registre du récepteur - il devrait être dans onResume et désinscription sur pause: http: // stackoverflow.com/questions/7887169/android-when-to-register-unregister-broadcast-récepteurs-créés-dans-une-activité –

Questions connexes