Предотвратить автоматический запуск моего приложения для Android, когда устройство/экран спит/заблокировано

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

[Редактировать]

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

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

person txuy    schedule 15.01.2015    source источник
comment
Вы написали код для метода onPause?   -  person duggu    schedule 15.01.2015
comment
Чтобы уменьшить количество убийств и перезапусков приложения, вы можете попробовать запустить службу с помощью внутреннего приложения. Но это не предотвращает перезапуск вашего приложения, а только уменьшает вероятность   -  person Tapa Save    schedule 15.01.2015


Ответы (2)


вы можете 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();
}
person snachmsm    schedule 15.01.2015
comment
Это кажется очень сложным. Я думаю, было бы проще отключить звуки в приложении, но я не знаю, как это сделать, только когда устройство спит: public void playSound(int id){ if(!DEVICE_IS_ASLEEP()) snds[id]. играть (идентификатор звука [id], 1, 1, 0, 0, 1); } - person txuy; 15.01.2015
comment
просто скопируйте все приведенные выше фрагменты в свою службу или действие и вызовите initBroadcasts() в onCreate. если Activity все еще живет, когда экран выключен (кстати, он не должен) - заблокирован/выключен/заставка включена - тогда вы можете передать screenOn boolean вашему playSound(int id, boolean screenOn) и внутри if(screenOn){...} - person snachmsm; 15.01.2015

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

person Pankaj Deshpande    schedule 15.01.2015