Обнаружение неактивности пользователя и отображение экрана пин-кода
Мне нужно показать экран 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;
}
Я думаю, есть более элегантные решения. Я надеюсь, что это помогает.