当用户处于非活动状态超过1分钟时,我需要显示一个Pincode屏幕。
我发现this answer为我的需求提供了一个很好的解决方案,我在 BaseActivity 上实现了它。
但现在我遇到了 onUserInteraction()方法的问题,每次按下按钮并开始新活动时,该方法被调用两次(并触发我的Runnable两次),因为当我1分钟后回到上一个屏幕,显示密码屏幕。
我已将Runnable更改为静态,但我失去了启动pincode活动的上下文。
我该怎样做才能从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" />
答案 0 :(得分:0)
嗯,我认为问题是方法 onUserInteraction()。文档说:
对您活动的onUserLeaveHint()回调的所有调用都将伴随对onUserInteraction()的调用。
链接here。 onUserLeaveHint()的文档说:
此回调和onUserInteraction()旨在帮助活动智能地管理状态栏通知;特别是,帮助活动确定取消通知的适当时间。
第二个链接here。
据我所知,每次暂停活动时和暂停前都会调用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;
}
我说,有更优雅的解决方案。我希望它有所帮助。