由于在android中处于非活动状态,15分钟后自动从应用程序注销

由于在android中处于非活动状态,15分钟后自动从应用程序注销,android,Android,我想在android应用程序中进行会话管理。如果用户处于非活动状态或未与应用程序交互,我想从应用程序中注销用户。我不知道什么时候开始服务。目前我正在onResume()中启动它。我用倒计时在15分钟后自动注销。但这是行不通的。是否有任何有效或有效的会话管理解决方案 注销服务: public class LogoutService extends Service { public static CountDownTimer timer; @Override public v

我想在android应用程序中进行会话管理。如果用户处于非活动状态或未与应用程序交互,我想从应用程序中注销用户。我不知道什么时候开始服务。目前我正在onResume()中启动它。我用倒计时在15分钟后自动注销。但这是行不通的。是否有任何有效或有效的会话管理解决方案

注销服务

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;
    }
}
main活动

@Override
        protected void onStop() {
            super.onStop();
            LogoutService.timer.cancel();
        }

    @Override
        protected void onResume() {
            super.onResume();
            startService(new Intent(this, LogoutService.class));
            LogoutService.timer.start();
        }

首先,我能猜出为什么它不工作的一个原因是可能是因为这个代码

 @Override
    protected void onStop() {
        super.onStop();
        LogoutService.timer.cancel();
    }
让我们假设,如果设备屏幕消失,onStop()将被触发,因此您的计时器将被取消,无需进一步检查

像这样取消onDestroy上的时间

 @Override
    protected void onDestroy() {
        super.onDestroy();
        LogoutService.timer.cancel();
    }
既然你问有没有更好的方法,那就是你可以使用触摸事件

在线程或计时器中启动计数器,如果计数器达到15分钟,则通过调用

 finish()
下面是检测整个活动onCreate()的onTouch事件的代码


这对我很有用:

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);
}

可能重复:为什么不尝试搜索?“这就是你想要的,”萨默什库马尔说,“我试过那个解决办法。但是15分钟没有锻炼。如果屏幕处于活动状态,它将工作。如果屏幕关闭,则不会进行训练。如果应用程序在background@kuffs中运行,则会立即注销。问题可能表明了这一点,但答案涵盖了各种选项。你读了吗?我的回答特别涉及您的用例。您能提供完整的实现吗?一个星期以来我一直被这个问题所困扰。@hiren你有没有试着先移动你的计时器。取消到onDestroy()?是的。我现在已经试过了,效果很好。但不管怎样,我都会在5分钟后退出。我想我需要将它与
onTouchListener()
集成。怎么做?因为您的计时器设置为5分钟:-)5*60*1000将其更改为15*60*1000 Yalla done..如果用户在第14分钟开始使用我的应用程序会怎么样?它仍然会将我注销。我怎样才能阻止它?因为在用户再次开始使用应用程序后,倒计时不会停止。
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);
}