如果屏幕被锁定(当应用程序仍然存在时)或者应用程序已移至后台超过5分钟,我想退出我的应用程序。我有一个扩展AppCompatActivity的BaseActivity。所有其他活动都扩展了BaseActvity 我在BaseActivity中使用了以下代码,但是在5分钟后,应用程序在LoginActivity中自行打开。你能帮帮我吗?
以下Java代码:
@Override
protected void onPause() {
super.onPause();
Log.v(TAG, "on pause called");
timer = new Timer();
Log.i(TAG, "Invoking logout timer");
LogOutTimerTask logoutTimeTask = new LogOutTimerTask();
timer.schedule(logoutTimeTask, 300000); //auto logout in 5 minutes
}
@Override
protected void onResume() {
super.onResume();
Log.v(TAG, "on resume called");
if (timer != null) {
timer.cancel();
Log.i(TAG, "cancel timer");
timer = null;
}
}
private class LogOutTimerTask extends TimerTask {
@Override
public void run() {
//redirect user to login screen
Constants.SESSION_ID = "";
Intent i = new Intent(getApplicationContext(), LoginActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
}
}
修改
我添加了所有可能的建议,但即使我启动应用程序,计时器仍在工作。代码片段很有用。
答案 0 :(得分:0)
@Override
protected void onPause() {
super.onPause();
long LastTime= System.currentTimeMillis(); //save this time
}
@Override
protected void onResume() {
super.onResume();
long CurrentTime= System.currentTimeMillis(); //this is your current time
//get LastTime and compare
long difference = CurrentTime - LastTime;
// now convert difference into minutes and start login activity
}
这可能对你有所帮助。
答案 1 :(得分:0)
您可以使用:
import java.util.Calendar
Calendar c = Calendar.getInstance();
int seconds = c.get(Calendar.SECOND);
int minutes = c.get(Calendar.MINUTES);
这将为您提供用户当前的时间。
您可以将它们保存在onStop()中,并在onRestart()/ onResume中查看它们(如果你将其销毁)。在那里你可以应用你的逻辑。进行一些计算,以便您可以获得有关已经过了多少时间的信息。 您可以将其保存为SharedPreferences或您喜欢的任何其他方式。
答案 2 :(得分:0)
这里的问题是您的LogoutTimerTask类,其中包含自动移动到登录屏幕的代码。不要在LogoutTimerTask类中启动一个活动。相反,设置一个全局定义的变量值,在运行5分钟后在run()方法内注销,当用户重新进入你的应用程序时,我建议你在onCreate中使用该变量来检查你是否已经手动注销用户并从那里调用适当的活动类
答案 3 :(得分:0)
我已使用以下代码段解决了该问题。 由于我在登录后使用片段,因此仅在包含片段的Activity中使用此代码帮助了我。
@Override
protected void onPause() {
super.onPause();
}
private class LogOutTimerTask extends TimerTask {
@Override
public void run() {
//redirect user to login screen
finish();
Constants.SESSION_ID = null;
}
}
@Override
protected void onStop() {
super.onStop();
timer = new Timer();
Log.i(TAG, "Invoking logout timer");
LogOutTimerTask logoutTimeTask = new LogOutTimerTask();
timer.schedule(logoutTimeTask, DISCONNECT_TIMEOUT); //auto logout in 5 minutes
}
@Override
public void onResume() {
super.onResume();
if (timer != null) {
timer.cancel();
Log.i(TAG, "cancel timer");
timer = null;
}
}