Android: остановите новое действие, выводящее приложение на передний план

Я вчера опубликовал вопрос, так как у меня есть некоторые конкретные требования, которые, кажется, довольно трудно выполнить с Android.

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

Приложение также должно перейти на страницу входа в систему, когда нажата кнопка "все открытые приложения" (не уверенна в названии), поскольку это не должно отображать снимок экрана текущего открытого действия, но должно отображать действие входа в систему.

Я играл с вариантами кода ниже:

@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);

    if(level >= TRIM_MEMORY_UI_HIDDEN && ((!isInputtingPIN && !isLoggedIn) || isLoggedIn)) {

        Log.d("AppGlobalData:", "*************** APP WINDOW IS BEING OBSCURED ***************");
        Intent login = new Intent(this.currentContext, AppEntryPoint.class);
        startActivity(login);
    }
}

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

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

Это было достигнуто в IOS путем простой реализации одного метода...

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

2 ответа

Решение

Вы можете обнаружить, что ваша активность переходит в фоновый режим с onPause жизненный цикл обратного вызова. Простым / наивным решением было бы установить логический флаг в true в onPause и в onResume проверьте этот флаг и отправьте пользователя в свой логин, если флаг установлен.

Чтобы обойти кнопку "все приложения", вы можете удалить контент или очистить ваши представления в onPause,

Мне удалось заставить все работать для моего варианта использования, довольно упрощенно, это может оказаться полезным для любого, кто хочет сделать это в будущем, я больше не использую onTrimMemory():

1) Когда пользователь вошел в систему, я установил глобальную переменную isLoggedIn, у меня есть переменная, которая устанавливается всякий раз, когда я запускаю новое намерение на другом экране в моем приложении:

public class GlobalData extends Application

public static boolean inTransition = false;
public static boolean isLoggedIn = false;

2) Создано 2 метода для реализации в каждой деятельности onPause() и onResume ():

public static void onResumeHandler(Context context) {
    inTransition = false;

    if(!isLoggedIn) {
        Intent login = new Intent(context, AppEntryPoint.class);
        context.startActivity(login);
    }
}

public static void onPauseHandler() {
    if(!inTransition) {
        isLoggedIn = false;
    }
}

3) Каждый раз, когда я запускаю новое намерение в моем приложении, устанавливаю переменную индикатора перехода:

case R.id.map_settings:
     GlobalData.inTransition = true;
     intent = new Intent(this, MapPreference.class);
     this.startActivity(intent);
     break;

4) В своей деятельности вызывайте обработчиков:

@Override
public void onResume() {
    GlobalData.onResumeHandler(this);

    super.onResume();
}

@Override
public void onPause() {
    GlobalData.onPauseHandler();

    super.onPause();
}

5) В действиях с предпочтениями мне также приходилось обрабатывать onBackPressed(), потому что в этих случаях я не запускаю новое намерение отойти от экрана настроек, а вместо этого нажимаю кнопку "Назад":

@Override
public void onBackPressed() {
    GlobalData.inTransition = true;

    super.onBackPressed();
}

Судя по небольшому объему тестирования, которое я провел, он, кажется, обрабатывает нажатие кнопки "Домой", нажатие кнопки "Все запущенные приложения" и переходит к экрану входа в систему.

6) Последнее, что я сделал для моего варианта использования, это то, что я не хотел, чтобы кнопка "Все запущенные приложения" отображала снимок экрана, когда она была нажата, поэтому в каждом упражнении я добавлял следующую строку в метод onCreate() для отключения снимков экрана:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,WindowManager.LayoutParams.FLAG_SECURE);    
Другие вопросы по тегам