Задать вопрос
@sitev_ru
sitev.ru - мой блог ...

Как определить статус приложения, что оно свёрнуто?

Нужно определить, что приложение свёрнуто (в зависимости от этого приложение будет выполнять различные действия).
  • Вопрос задан
  • 4638 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 2
kozinakoff
@kozinakoff
iOS-developer
Есть такой чудесный класс ActivityLifecycleCallbacks. Вот тут хороший пример использования: baroqueworksdev.blogspot.ru/2012/12/how-to-use-act...

Идея такая: в своем классе, имплементирующем ActivityLifecycleCallbacks, заводим счетчик, который будет считать количество запущенных/остановленных activity и метод а-ля isAppInForeground().

private int startStatus = 0;
...
    @Override
    public void onActivityStarted(Activity activity) {
        ++startStatus;
    }

    @Override
    public void onActivityStopped(Activity activity) {
        --startStatus;
    }

    public boolean isAppInForeground() {
        return startStatus > 0;
    }
Ответ написан
enq3
@enq3
Android engineer at #ITX5
Я рассуждаю так. Раз приложение свернули, значит активность больше нам не видна. И должен сработать метод onStop. Но из активности можно выйти нажатием кнопки назад, и это тоже вызовет onStop , надо это обработать. Также onStop сработает, если мы запустим новую активность в нашем приложении или повернем устройство.

BaseActivity.java
public class BaseActivity extends AppCompatActivity {
    protected boolean isShowAlert = true;
    private int oldOrientation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        oldOrientation = getResources().getConfiguration().orientation;
    }

    @Override
    protected void onPause() {
        super.onPause();
        int currentOrientation = getResources().getConfiguration().orientation;
        if(currentOrientation != oldOrientation)
            isShowAlert = false;
    }

    @Override
    protected void onStart() {
        super.onStart();
        isShowAlert = true;
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (isShowAlert)
            AppHideHandler();
    }

    @Override
    public void onBackPressed() {
        isShowAlert = false;
        super.onBackPressed();
    }

    public void AppHideHandler() {
        AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
        builder.setTitle("Сообщение")
                .setMessage("Приложение свернули")
                .setCancelable(true);
        AlertDialog alert = builder.create();
        alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        alert.show();
    }
}


За показ сообщения отвечает isShowAlert. Не забываем ставить ему true в onStart, т.к. при запуске новой активности это ключ будет установлен в false и при возврате обратно уже не позволит отслеживать сворачивание.
В onPause сравниваем конфигурацию, если устройство повернули, значит показывать сообщение не нужно.
В AndroidManifest.xml надо добавить:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>


Наследуемся от нашей базовой активности. И теперь по умолчанию при сворачивании будет показываться сообщение.
MainActivity.java
public class MainActivity extends BaseActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isShowAlert = false;
                startActivity(new Intent(MainActivity.this, Main2Activity.class));
            }
        });
    }
}

Также при запуске новой активности ставим ключ в false, чтобы сообщение не показывалось.

В данной реализации сообщение будет показано, если вызвать список запущенных ранее приложений (долгий тап по кнопке Home).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@NgNl
Jira dev
@Valodemorz
Только вот беда, onStop может быть и не вызван. Последний гарантированно-вызываемый метод - onPause
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы