Как я могу узнать, возобновлено ли мое приложение с фона?

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

После успешного ввода пароля пользователь может увидеть возобновленную активность иначе он не может.

Как я могу это сделать?

Ответ 1

Вы можете добиться этого, если у вас есть глобальная активность "MyActivity", и все действия простираются от нее.

Затем вы переопределяете методы onPause и onStop на "MyActivity"

@Override
public void onPause()
{
    super.onPause();
    setLockStatus(false);
}

@Override
public void onStop()
{
    super.onStop();
    setLockStatus(true);
}

и

@Override
public void onResume()
{
    super.onResume();
    checkLockScreen();
}

EDIT: Очевидно, вам нужно создать методы setLockStatus и checkLockScreen и сделать все, что вы хотите (например, сохранить статус в sharedPreferences).

Ответ 2

Основная проблема заключается в том, что вам нужно получить конкретное поведение при запуске Activity из фона. onPause() и onResume() вызывается каждый раз, когда вы переключаетесь между Activities, а не только при сворачивании приложения. Чтобы обойти это, вы можете получить текущие запущенные задачи из ActivityManager и сравнить их имя пакета с одним из ваших приложений:

private boolean isApplicationInBackground() {
    final ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    final List<RunningTaskInfo> tasks = manager.getRunningTasks(1);
    if (!tasks.isEmpty()) {
        final ComponentName topActivity = tasks.get(0).topActivity;
        return !topActivity.getPackageName().equals(getPackageName());
    }    
    return false;
}

Теперь вы можете сделать это:

public boolean wasPaused = false;

@Override
public void onPause() {
    super.onPause();

    if(isApplicationInBackground()) {
        wasPaused = true;
    }
}

@Override
public void onResume() {
    super.onResume();

    if(wasPaused) {
        lockScreen();
        wasPaused = false;
    }
}

И это все! Я рекомендую вам реализовать это в базе Activity, которая присуща всем вашим другим Activities.

Ответ 3

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

Ответ 4

Для всех, кого это интересует, если я правильно понимаю ваш вопрос, я искал аналогичную функциональность и не был доволен тем, что нашел. Я хотел бы определить, когда действие возобновлялось из-за фона или когда оно возобновлялось из вызываемой активности.

В итоге я использовал логический флаг, который устанавливается из startActivity, который позволит вызывающей активности определять, возобновляется ли она из вызываемой активности или из фона. Что-то вроде этого

private static boolean RESUME_FROM_ACTIVITY;

@Override
public void onResume(){
    super.onResume();
    if(!RESUME_FROM_ACTIVITY){
        // do what you want like lock the screen
    }
    RESUME_FROM_ACTIVITY = false;
}

@Override
public void startActivity(Intent intent){
    RESUME_FROM_ACTIVITY = true;
    super.startActivity(intent);
}

Из-за того, что Android обрабатывает статику и стек действий (читайте больше в этом сообщении в блоге), это должно работать концептуально. Немного больше объяснений, статичность должна быть одной из последних вещей, которые очищаются от памяти, когда ваше приложение работает, если кучное пространство становится слишком большим. Действие не будет уничтожено без уничтожения самого стека, поэтому будет вызываться onResume, и он проверит статический флаг, чтобы узнать, поступает ли он от другого действия или из фона.

Статичность, вероятно, даже будет излишней, так как снова сама деятельность не будет уничтожена, и глобальные глобальные значения будут проводиться как можно дольше. Это только концептуально, и мы все еще находимся в центре стресс-тестирования, но это вариант. Если мы найдем какие-либо проблемы, я обновлю это сообщение.

Ответ 5

Ну, вы должны переопределить методы onResume и onPause

см. this, и вы получите его:)

в вашей деятельности вы можете иметь флаг boolean locked;

и в onPause вы можете установить значение true. И каждый раз в критических местах вы можете проверить состояние этого флага, и если это правда, то вы показываете активность разблокировки, после успеха в разблокировке установите флаг в false.