2015-01-15 8 views
0

Проблема в том, что если мое приложение запущено и устройство (экран) заблокировано, приложение перезапускается, когда устройство заблокировано (я знаю, потому что я может слышать звук моего приложения при запуске).Запретить запуск приложения для Android, когда устройство/экран спал/заблокирован

[изменить]

Это кажется очень сложным. Я думаю, было бы легче, чтобы выключить звук в приложении, но я не знаю, как сделать это только тогда, когда устройство спит:

public void playSound(int id){ 
    if(!DEVICE_IS_ASLEEP()) 
     snds[id].play(soundID[id], 1, 1, 0, 0, 1); 
} 
+0

Вы пишете код на onPause? – duggu

+0

Чтобы уменьшить приложение для убийства и перезагрузки, вы можете попробовать запустить службу с внутренним приложением. Но это не помешает перезагрузке вашего приложения, только уменьшит вероятность. –

ответ

0

вы можете registerReceiver с помощью Context (возможно внутри службы)

//assuming user starting Service by press smth in app (or simple open it), so the screen will be on for sure 
boolean screenOn=true; 

//put this inside your onCreate 
private void initBroadcasts(){ 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    filter.addAction(Intent.ACTION_USER_PRESENT); 
    //new feature from API 17 - screensaver (?) 
    if(android.os.Build.VERSION.SDK_INT>=17){ 
     filter.addAction(Intent.ACTION_DREAMING_STARTED); 
     filter.addAction(Intent.ACTION_DREAMING_STOPPED); 
    } 

    screenOn = getScreenUnlocked(); 
    this.registerReceiver(screenBroadcastReceiver, filter); 
} 

screenBroadcastReceiver является BroadcastReceiver, как показано ниже:

private BroadcastReceiver screenBroadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent myIntent) { 
     if(myIntent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
      screenOn=getScreenUnlocked(); 
     else if(myIntent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
      screenOn=false; 
     else if(myIntent.getAction().equals(Intent.ACTION_USER_PRESENT)) 
      screenOn=true; 
     else if(android.os.Build.VERSION.SDK_INT>=17){ 
      if(myIntent.getAction().equals(Intent.ACTION_DREAMING_STARTED)) 
       screenOn=false; 
      else if(myIntent.getAction().equals(Intent.ACTION_DREAMING_STOPPED)) 
       screenOn=getScreenUnlocked(); 
     } 
    } 
}; 

проверить, если экран разблокирован:

private boolean getScreenUnlocked(){ 
    KeyguardManager kgMgr = 
      (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
    return !kgMgr.inKeyguardRestrictedInputMode(); 
} 
+0

Это кажется очень сложным. Я думаю, что было бы проще отключить звуки в приложении, но я не знаю, как это сделать, только когда устройство спит: public void playSound (int id) { if (! DEVICE_IS_ASLEEP()) snds [id] .play (soundID [id], 1, 1, 0, 0, 1); } – txuy

+0

просто скопируйте все приведенные выше фрагменты в свою Службу или Деятельность и вызовите 'initBroadcasts()' в 'onCreate'. если активность по-прежнему сохраняется, когда экран выключен (это не должно быть btw.) - заблокировано/выключено/заставка включена - тогда вы можете передать 'screenOn' boolean на ваш' playSound (int id, boolean screenOn) 'и внутри' if (screenOn) {...} ' – snachmsm

+0

Спасибо, это работает! – txuy

0

Когда изменения конфигурации происходят с приложением как блокировка экрана, действие перезапускается. Вы получите так много ответов на stackoverflow, чтобы избежать этой проблемы, например this; но согласно Google Engineers, плохой практикой является сохранение активности. Вы получите правильный ответ о том, как избежать этой проблемы. here