Обнаружение неактивности пользователя и отображение экрана пин-кода

Мне нужно показать экран Pincode, когда пользователь неактивен более 1 минуты.

Я нашел этот ответ, который дал мне хорошее решение для моих нужд, и я реализовал его на своей BaseActivity.

Но теперь у меня проблема с методом onUserInteraction(), который вызывается дважды (и дважды запускает мой Runnable) каждый раз, когда я нажимаю кнопку и начинаю новое действие, потому что, когда я возвращаюсь через 1 минуту к предыдущему экрану, экран пин-кода показывает.

Я изменил свой Runnable на статический, но теряю контекст, чтобы начать пин-код.

Что я могу сделать, чтобы запустить действие из запускаемого файла или убедиться, что onUserInteraction() запускается только тогда, когда что-то нажимается на экране?

Мой текущий код:

  public class BaseActivity {
        private static final String TAG = BaseActivity.class.getSimpleName();

    static private Handler disconnectHandler = new Handler() {
        public void handleMessage(Message msg) {
        }
    };

    private Runnable disconnectCallback = new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(BaseActivity.this, CustomPinActivity.class);
            startActivity(intent);
        }
    };

    public void resetDisconnectTimer() {
        disconnectHandler.removeCallbacks(disconnectCallback);
        disconnectHandler.postDelayed(disconnectCallback, getResources().getInteger(R.integer.disconnect_timeout));
    }

    public void stopDisconnectTimer() {
        disconnectHandler.removeCallbacks(disconnectCallback);
    }

    @Override
    public void onUserInteraction() {
        resetDisconnectTimer();
    }

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

    @Override
    public void onStop() {
        super.onStop();
        stopDisconnectTimer();
    }
}

Manifest:

<activity
        android:name=".CustomPinActivity"
        android:launchMode="singleTop"
        android:label="@string/title_activity_pincode" />

<activity android:name=".base.BaseActivity"
        android:launchMode="singleTop" />

1 ответ

Ну, я думаю, что проблема заключается в методе onUserInteraction(). В документации сказано:

Все вызовы обратного вызова onUserLeaveHint() вашей активности будут сопровождаться вызовами onUserInteraction().

Ссылка здесь. Документация для onUserLeaveHint() гласит:

Этот обратный вызов и onUserInteraction() предназначены для того, чтобы помочь действиям интеллектуально управлять уведомлениями в строке состояния; в частности, для оказания помощи деятельности определить правильное время для отмены уведомления.

Вторая ссылка здесь.

Я понимаю, что метод onUserInteraction() будет вызываться каждый раз, когда действие приостанавливается, и перед паузой. Так что я бы использовал флаг как:

    private boolean mStartingActivity;
    private Runnable disconnectCallback = new Runnable() {
            @Override
            public void run() {
                        mStartingActivity = true;
                        Intent intent = new Intent(BaseActivity.this, CustomPinActivity.class);
                        startActivity(intent);
                    }
                };

@Override 
public void onUserInteraction() {
                    if(!mStartingActivity)
                          resetDisconnectTimer();
                }

@Override
protected void onResume() {
                    super.onResume();
                    resetDisconnectTimer();
                    mStartingActivity = false;
                }

Я думаю, есть более элегантные решения. Я надеюсь, что это помогает.

Другие вопросы по тегам