Обнаружение неактивности пользователя и отображение экрана пин-кода - PullRequest
0 голосов
/ 29 мая 2018

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

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

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

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

Что можно сделать, чтобы запустить действие из 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();
    }
}

Манифест:

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

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

1 Ответ

0 голосов
/ 29 мая 2018

Ну, я думаю, что проблема в методе 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;
                }

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

...