我想在我的android应用程序中进行会话管理。如果用户不活动或不与应用程序交互,我想从应用程序注销用户。我不知道什么时候开始服务。目前我在onResume()中启动它。我使用CountDownTimer在15分钟后自动注销。但这不起作用。是否有任何有效或有效的会话管理解决方案。
LogoutService
:
public class LogoutService extends Service {
public static CountDownTimer timer;
@Override
public void onCreate(){
// TODO Auto-generated method stub
super.onCreate();
timer = new CountDownTimer(5 * 60 * 1000, 1000) {
public void onTick(long millisUntilFinished) {
//Some code
Log.v("LogoutService", "Service Started");
}
public void onFinish() {
Log.v("LogoutService", "Call Logout by Service");
// Code for Logout
stopSelf();
}
};
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
MainActivity
:
@Override
protected void onStop() {
super.onStop();
LogoutService.timer.cancel();
}
@Override
protected void onResume() {
super.onResume();
startService(new Intent(this, LogoutService.class));
LogoutService.timer.start();
}
答案 0 :(得分:0)
首先,我可以猜到为什么它不起作用的原因可能是因为这段代码。
@Override
protected void onStop() {
super.onStop();
LogoutService.timer.cancel();
}
让我们假设如果触发了设备屏幕,那么onStop()会被触发,因此您的计时器将被取消,无需进一步检查。
取消onDestroy这样的时间。
@Override
protected void onDestroy() {
super.onDestroy();
LogoutService.timer.cancel();
}
现在既然你问有没有更好的方法,你可以使用触摸事件
并在线程或计时器中启动计数器,如果计数器达到15分钟,则通过调用
关闭您的活动 finish()
以下是检测onCreate()
上整个活动的onTouch事件的代码 setContentView(R.id.main);
View view = findViewById(R.id.main);
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view,MotionEvent event) {
nTouchCouter = 0; // Don't forget to reset the counter onTouch
return true;
}
});
答案 1 :(得分:0)
这对我有用:
private Handler handler;
private Runnable r;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Your code
handler = new Handler();
r = new Runnable() {
Toast.makeText(MainActivity.this, "user is inactive from last 5 minutes",
Toast.LENGTH_SHORT).show();
// Preform you action here
};
startHandler();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopHandler();
}
@Override
public void onUserInteraction() {
super.onUserInteraction();
stopHandler();
startHandler();
}
public void stopHandler() {
handler.removeCallbacks(r);
}
public void startHandler() {
handler.postDelayed(r, 10000);
}