2016-05-18 8 views
0

У меня есть приложение, которое я использую, который автоматически блокирует (требуется экран ввода пароля) ...Добавление экрана PASSWORD в приложение, которое заново блокируется при смене устройства?

a) when the app starts for the first time 
b) when another app is started and takes over the device 
c) when the device "sleeps" automatically 
d) when the user "sleeps" the device manually 
(note: with c & d, if the user "awakens" the app within 5 seconds, it does NOT ask for the password) 

Я хотел бы сделать это за приложение, которое я пишу, а поэтому я создал деятельность (PasswordActivity) с необходимыми этапами проверки и правильной работой.

Я изначально разместил его в ONCREATEMainActivity (который был ЗАПУСКА в AndroidManifest). Казалось, что все работает нормально. Но затем начал с возможности повторной блокировки. Поэтому попробуйте переместить его на ONSTART или ONRESUME. Но тогда, когда другая АКТИВНОСТЬ в моем APP сделала фокус, или экран повернулся, то PasswordActivity снова выстрелил. Это не сработает.

Здесь я нашел нить, рекомендующую сделать это приложение LAUNCHER в манифесте, а затем, когда пароль в порядке, вызовите MainActivity. Казалось, что он работает лучше ... но затем столкнулся с проблемой, что он «блокируется» только тогда, когда пользователь нажал кнопку «Назад» с главного экрана (я предполагаю, что остановил свое приложение) и снова запустил приложение. Однако не поймать другой APP, захватив устройство.

На основании этого и после просмотра всей документации я могу найти на жизненных циклах (хотя большинство из них основаны на ACTIVITY, а не APPLICATION) не уверены, как поймать, когда APP сам теряет фокус (другое приложение берет на себя) и как обращаться с автоматическим или ручным сном (C & D выше) вместе с проверкой временной задержки. Я предполагаю, что это будет комбинация нескольких вызовов или шагов, но точно не знаю, какие именно на этом этапе.

Любые рекомендации?

+0

Я думаю, что когда ваше приложение переходит на задний план (теряет фокус), выполняется функция 'onPause'. Это то, о чем вы просите? – UDKOX

+0

'OnPause' от того, что я могу сказать (и читал в Интернете в отношении LIFECYCLES, когда действие теряет фокус ... не обязательно сам APP. Если я попытаюсь поймать его в' onPause', это произойдет, когда другое действие WITHIN my – Peter

+0

Не можете ли вы просто проверить, имеет ли другая активность фокус? Что-то вроде: 'public void onPause() {if (! hasAnotherActivityFocus()) {lockPassword();}}' – UDKOX

ответ

0

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

Как уже упоминалось, самая большая проблема, о которой я могу судить, заключается в отсутствии встроенных вызовов функций, которые могут определять, когда «ваше приложение» не находится на переднем плане. и onResume основаны на действии, а не на приложениях ... поэтому переход от активности к активности в вашем приложении и даже поворот экрана вызывает их.

Чтобы обойти это ... Я создал глобальную переменную, называемую gv.appPauseTime. Я создал две отдельные универсальные функции, которые я могу вызвать из любого места в моем приложении.

public static void lockAppStoreTime() { 
    gv.appPauseTime=new Date(); 
} 

public static void lockAppCheck(Activity act) { 
    boolean bLock=false; 

    // Check to see if this is the first time through app  
    if (gv.appPauseTime==null) { 
     bLock = true; 
    } else { 
     Date currTime = new Date(); 
     long diffMillis = currTime.getTime() - gv.appPauseTime.getTime(); 
     long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffMillis); 

     // Lock app if 120 seconds (2 minutes) has lapsed 
     if (diffInSec > 120) { 
      bLock=true; 
     } 
    } 

    gv.appLastPause = new Date(); 
    if (bLock) { 
     Intent j = new Intent(act, PasswordActivity.class); 
     act.startActivity(j); 
    } 
} 

В любой деятельности, я создаю (или изменения) в и onResume как так ...

@Override 
public void onPause(){ 
    super.onPause(); 
    Util.lockAppStoreTime(); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    Util.lockAppCheck(this); 
} 

Когда пожары, он сохраняет текущую дату (время). Когда onResume срабатывает в любой функции, он сравнивает текущую дату (время) с сохраненной. Если время истечения 120 секунд (2 минуты), оно отображает PasswordActivity, чтобы проверить пароль. Он «хранит» текущую дату (время), прежде чем он вызовет PasswordActivity, чтобы он не продолжал повторную итерацию.

В принципе, если между приостановкой активности и любыми действиями происходит пауза в течение 2 минут, в МОЕМ ПРИЛОЖЕНИИ, возобновляя (или начинать), он запрашивает пароль. Если пользователь открывает другой APP, а затем снова возвращается к моему APP ..., если он длится не менее 2 минут, тогда запрашивается пароль.Если пользователь отключает или закрывает приложение, перезапуск также запускает пароль.

Я выбрал 2 минуты, потому что это похоже на приличный «промежуток времени» в нашем приложении в целом. Конечно, это тоже можно изменить.

До сих пор так хорошо. Надеюсь, это поможет кому угодно.