2015-12-08 2 views
0

Вчера я опубликовал вопрос, поскольку у меня есть некоторые конкретные требования, которые, как представляется, довольно сложно достичь с помощью 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 просто реализует один метод ...

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

ответ

1

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

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

+0

Эй, спасибо, я на самом деле в середине что-то делать именно так, как вы описываете, пытаясь использовать отслеживание состояния переменной и onWindowFocusChanged, затем накладывая мой текущее представление содержимого активности с определенным для скрытия содержимого экрана в onPause. Затем после этого я всегда отправляю пользователя обратно для входа, когда приложение восстанавливает фокус. Это был процесс проб и ошибок, хотя, спасибо! – berimbolo

0

мне удалось получить все работает для моего случая использования в весьма упрощенном виде, это может оказаться полезным для тех, кто хочет сделать это в будущем, я не использую 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);  
Смежные вопросы