我正在编写一个需要在一段时间不活动后自动注销的应用程序。
我使用计时器在一段时间不活动后触发注销事件。
问题:如果应用程序在后台,则登录活动的开始会重新打开该应用程序。
负责解雇
在 new LogoutEvent()
AUTO_LOGOUT_WAIT_TIME_MS
public class LogoutTimer {
private static LogoutTimer timer;
private Handler handler;
private Runnable runnable;
private LogoutTimer() {
this.handler = new Handler();
this.runnable = new Runnable() {
@Override
public void run() {
Log.i(AppConfig.LogTags.SECURITY, "auto logout of application");
EventBus.getDefault().post(new LogoutEvent(LogoutTypeEnum.SESSION_EXPIRED));
}
};
}
public static LogoutTimer getInstance() {
if (timer == null) {
timer = new LogoutTimer();
}
return timer;
}
public void restart(String source) {
Log.i(AppConfig.LogTags.SECURITY, "restarting logout timer. Source: (" + source + ")");
this.clearHandler();
handler.postDelayed(runnable, AppConfig.AUTO_LOGOUT_WAIT_TIME_MS);
}
public void stop(String source) {
Log.i(AppConfig.LogTags.SECURITY, "stopping logout timer. Source: (" + source + ")");
this.clearHandler();
}
private void clearHandler() {
handler.removeCallbacks(runnable);
}
}
以下代码启动我的LoginActivity。 还当应用程序在后台时重新打开应用程序甚至!
当我将此代码放在Activity中时,也会出现此问题。
public class MyApplication extends Application {
// other non relevant code here
public void onEvent(LogoutEvent event) {
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(AppConfig.Args.DATA_ITEM_OTHER, event.getLogoutType());
startActivity(intent);
}
}
答案 0 :(得分:0)
好的..这就是我的想法..它自动注销然后带你到loginactivity很好 - 如果用户在您的应用程序ryt上闲置? 另一个条件是,如果用户当前不在您的应用程序上,它不应该启动ryt ??
我也会为您创建静态自定义数据和布尔值,以便存储您的条件,因此可能是时间到期,因为您的应用程序在后台运行 你可以存储一个
boolean logout = true;
所以下次用户回来时会检查状态并从那里开始......你也可以存储你的数据..把一些代码放到一边看看
public class MyApplication extends Application {
// other non relevant code here
static boolean activityOnpauseCalled, logOut = false; //put activityOnpauseCalled = true in your onpause of the main activity
public void onEvent(LogoutEvent event) {
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(AppConfig.Args.DATA_ITEM_OTHER, event.getLogoutType());
if(!MyApplication.activityOnpauseCalled){
startActivity(intent);
}
}
}
只要触发注销事件且activityOnPauseCalled为true,就会触发logout为true。在if(){}语句中,检查主活动的onresume上的logOut是否为true
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
MyApplication.activityOnPauseCalled = true;
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if(MyApplication.logOut){
MyApplication.logOut = false;
//let the user sign in
}else{
//do otherwise.. think that would not happen in your case right?? btw,let it start normally
}
}
然后终于时间任务
private LogoutTimer() {
this.handler = new Handler();
this.runnable = new Runnable() {
@Override
public void run() {
Log.i(AppConfig.LogTags.SECURITY, "auto logout of application");
EventBus.getDefault().post(new LogoutEvent(LogoutTypeEnum.SESSION_EXPIRED));
MyApplication.logOut = true;
}
};
}
希望我足够清醒。我知道这是否有用或其他什么大声笑..
答案 1 :(得分:0)
感谢您对@Elltz的帮助。我从answer中获取的是:
loginActivity
(这似乎是导致应用程序返回到前台的原因)我是如何做到这一点的:
@Override
protected void onCreate(Bundle savedInstanceState) {
this.application = (MyApplication) getApplication();
}
@Override
protected void onPause() {
super.onPause();
this.application.activityPaused();
}
@Override
protected void onResume() {
super.onResume();
this.application.activityResumed();
}
private void startLoginActivity(LogoutTypeEnum logoutType) {
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(AppConfig.Args.DATA_ITEM_OTHER, logoutType);
startActivity(intent);
}
public void onEvent(LogoutEvent event) {
if (this.isActivityPaused) {
this.shouldLogoutOnResume = true;
return;
}
this.startLoginActivity(event.getLogoutType());
}
public void activityPaused() {
this.isActivityPaused = true;
}
public void activityResumed() {
this.isActivityPaused = false;
if (this.shouldLogoutOnResume) {
this.startLoginActivity(LogoutTypeEnum.SESSION_EXPIRED);
this.shouldLogoutOnResume = false;
}
}