Блокировка андроид приложения после определенного количества времени простоя

голоса
6

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

Приложение имеет несколько действий, но я хотел бы тайм - аут , чтобы быть глобальным для всех видов деятельности. Таким образом, это не было бы достаточно , чтобы создать поток таймера в onPause()методе Activity.

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

Задан 23/02/2009 в 06:23
источник пользователем
На других языках...                            


4 ответов

голоса
5

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

Общая идея просто для отслеживания времени системных часов в SharedPreference всякий раз, когда какой-либо активности пауз - звучит достаточно просто, но, увы, есть дыра в безопасности, если это все, что вы используете, так что часы сбрасывает при перезагрузке. Чтобы обойти, что:

  • Иметь Applicationподкласс или общий статический класс одноплодного с глобальным разблокирована-так-загрузочное состояние (изначально ложь). Это значение должно жить до тех пор , как процесс приложения.
  • Сохранение системного времени ( в реальном время с момента загрузки) в каждом соответствующем ActivityonPauseв SharedPreferenceслучае , если текущее состояние приложения разблокировано.
  • Если appwide разблокирована-так-ботинка состояние ложного (чистый старт приложения - либо приложение или телефон перезапускается), показывает экран блокировки. В противном случае, проверьте SharedPreference«ы значения на onResume блокируемой активности в; если он не существует , или больше , чем SharedPreferenceзначение + тайм - аут, а также показывать экран блокировки.
  • Когда приложение разблокировано, установите appwide разблокирована-Since загрузки состояния в действительность.

Кроме того, тайм-аут, этот подход будет также автоматически заблокировать приложение, если ваше приложение будет убит и перезапускает или если ваш телефон перезагрузится, но я не думаю, что это особенно плохо проблемой для большинства приложений. Это чуть более безопасное и может заблокировать unecessarily на пользователях, задача переключения много, но я думаю, что это стоит компромисс для уменьшения кода и сложностей с помощью полного удаления каких-либо проблем фонового процесса / wakelock (без каких-либо услуг, сигнализации или приемников, необходимых ).

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

Ответил 28/06/2011 в 05:10
источник пользователем

голоса
3

Я имел дело с этим, используя AlarmManager для планирования и отмены действия тайм-аута.

Тогда в OnPause () случае все мою Активности, запланировать тревогу. В onResume () случае все моей деятельности, я проверяю, если сигнал гаснет. Если тревога ушла, мне выключить приложение. Если тревога не ушла еще я его отменить.

Я создал Timeout.java управлять своей тревогой. При срабатывании будильника намерение обжигают:

public class Timeout {
    private static final int REQUEST_ID = 0;
    private static final long DEFAULT_TIMEOUT = 5 * 60 * 1000;  // 5 minutes

    private static PendingIntent buildIntent(Context ctx) {
        Intent intent = new Intent(Intents.TIMEOUT);
        PendingIntent sender = PendingIntent.getBroadcast(ctx, REQUEST_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        return sender;
    }

    public static void start(Context ctx) {
        ctx.startService(new Intent(ctx, TimeoutService.class));

        long triggerTime = System.currentTimeMillis() + DEFAULT_TIMEOUT;

        AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);

        am.set(AlarmManager.RTC, triggerTime, buildIntent(ctx));
    }

    public static void cancel(Context ctx) {
        AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);

        am.cancel(buildIntent(ctx));

        ctx.startService(new Intent(ctx, TimeoutService.class));

    }

}

Затем я создал службу, чтобы захватить намерение генерируемого сигнала тревоги. Она устанавливает некоторое глобальное состояние в моем экземпляре класса приложения, чтобы указать, что приложение должно блокировать:

public class TimeoutService extends Service {
    private BroadcastReceiver mIntentReceiver;

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

        mIntentReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();

                if ( action.equals(Intents.TIMEOUT) ) {
                    timeout(context);
                }
            }
        };

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intents.TIMEOUT);
        registerReceiver(mIntentReceiver, filter);

    }

    private void timeout(Context context) {
        App.setShutdown();

        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        nm.cancelAll();
    }

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

        unregisterReceiver(mIntentReceiver);
    }

    public class TimeoutBinder extends Binder {
        public TimeoutService getService() {
            return TimeoutService.this;
        }
    }

    private final IBinder mBinder = new TimeoutBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

}

Наконец, я создал подкласс деятельности, что вся деятельность моего приложения в подкласс от управления запирание и отпирание:

public class LockingActivity extends Activity {

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

        Timeout.start(this);
    }

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

        Timeout.cancel(this);
        checkShutdown();
    }

    private void checkShutdown() {
        if ( App.isShutdown() ) {
            finish();
        }

    }

}

Использование OnPause и onResume, чтобы начать и остановить время ожидания дает мне следующую семантику. До тех пор пока одна из деятельности моего приложения активно, часы ожидания не работают. Так как я использовал тип тревоги из AlarmManager.RTC, когда телефон переходит в спящий режим тайм-аут часы работает. Если тайм-аут происходит, когда телефон спит, то моя служба будет забрать тайм-аут, как только телефон просыпается. Кроме того, часы работают, когда любая другая деятельность, открыта.

Для более подробной версии этого, вы можете увидеть, как я на самом деле реализовать их в своем приложении https://github.com/bpellin/keepassdroid

Ответил 28/11/2009 в 02:22
источник пользователем

голоса
2

Проверьте, как OpenIntents Safe реализует эту функциональность.

Ответил 23/02/2009 в 06:37
источник пользователем

голоса
0

Это было очень полезно для меня пост. Чтобы поддержать концепцию, данное @Yoni Samlan. Я реализовал это так

public void pause() {
        // Record timeout time in case timeout service is killed    
        long time = System.currentTimeMillis();     
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor edit = preferences.edit();
        edit.putLong("Timeout_key", time);// start recording the current time as soon as app is asleep
        edit.apply();
    }

    public void resume() {       
        // Check whether the timeout has expired
        long cur_time = System.currentTimeMillis();
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        long timeout_start = preferences.getLong("Timeout_key", -1);
        // The timeout never started
        if (timeout_start == -1) {
            return;
        }   
        long timeout;
        try {
            //timeout = Long.parseLong(sTimeout);
            timeout=idle_delay;
        } catch (NumberFormatException e) {
            timeout = 60000;
        }
        // We are set to never timeout
        if (timeout == -1) {
            return;
        }
        if (idle){
        long diff = cur_time - timeout_start;
        if (diff >= timeout) {  
            //Toast.makeText(act, "We have timed out", Toast.LENGTH_LONG).show(); 
            showLockDialog();
        }
        }
    } 

Вызов метода паузы из OnPause и возобновить метод из onResume.

Ответил 06/11/2014 в 16:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more