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);