Java 在安卓系统中,应用程序30分钟后自动注销时使用什么

Java 在安卓系统中,应用程序30分钟后自动注销时使用什么,java,android,Java,Android,我希望我的应用程序在30分钟后自动注销。所以我对我有很多选择感到困惑。 1.1处理程序 但我认为如果我使用处理程序,它将不会计算显示睡眠时间,而且我也无法在另一个活动中恢复处理程序。 2.警报管理器 我对它了解不多,但我认为它需要更多的cpu内存。 3.倒计时管理器就像我在下面使用的一样 new CountDownTimer(40000, 1000) { //40000 milli seconds is total time, 1000 milli seconds is time interva

我希望我的应用程序在30分钟后自动注销。所以我对我有很多选择感到困惑。 1.1处理程序 但我认为如果我使用处理程序,它将不会计算显示睡眠时间,而且我也无法在另一个活动中恢复处理程序。 2.警报管理器 我对它了解不多,但我认为它需要更多的cpu内存。 3.倒计时管理器就像我在下面使用的一样

new CountDownTimer(40000, 1000) { //40000 milli seconds is total time, 1000 milli seconds is time interval

 public void onTick(long millisUntilFinished) {
  }
  public void onFinish() {
 }
}.start();
但我可以在另一个活动中恢复倒计时管理器过程吗 4.java中的定时器 它将创建另一个线程


或者这就是我应该使用服务并包括上述方法之一的必要性。因为有可能用户可以按home按钮,应用程序将转到onPause()状态。或者显示器会在一段时间后休眠。我也不希望我的应用程序变慢。使用服务会使我的应用程序变慢。有人能帮我吗。

您可以使用超时,下面是一个简单的示例

    public static final int TIMEOUT_FOR_APPLICATION = 1800000;//exit app after 30 minutes



    private void timeout() {

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {

        finish();//or whatever you want to do


        }
    }, TIMEOUT_FOR_APPLICATION);

}
希望这就是你想要的


干杯

您可以使用超时,下面是一个简单的示例

    public static final int TIMEOUT_FOR_APPLICATION = 1800000;//exit app after 30 minutes



    private void timeout() {

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {

        finish();//or whatever you want to do


        }
    }, TIMEOUT_FOR_APPLICATION);

}
希望这就是你想要的


干杯

使用AlamManager并在30分钟后设置警报。您必须为此使用pending intent,以便在30分钟后调用您的服务。你可以在那里编写代码

你可以看到

如果你想得到空闲时间,那么如果你想得到触摸或焦点,那么你可以重置警报


对于屏幕关闭,您可以在onPause和onResume上编写代码。

使用AlamManager并在30分钟后设置警报。您必须为此使用pending intent,以便在30分钟后调用您的服务。你可以在那里编写代码

你可以看到

如果你想得到空闲时间,那么如果你想得到触摸或焦点,那么你可以重置警报


对于screen off,您可以在onPause和onResume中编写代码。

在类用户中添加一个字段lastLogin

private static final Long EXPIRE_TIME = 1000L * 60 * 30; //30M
private static final Long DELAY_TIME = 1000L * 60 * 5;
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleWithFixedDelay(new ContainerCleaner(), EXPIRE_TIME, DELAY_TIME, TimeUnit.MILLISECONDS);

public class ContainerCleaner implements Runnable {
    @Override
    public void run() {
        UserCache.cleanupContainer();
    }
}
在用户缓存中

public synchronized void cleanupContainer() {
    Collection<User> users= userCache.values();
    for (Userp : users) {
        if (isExpired(p)) {
            expire(p);
        }
    }
}
private boolean isExpired(SessionProfile sessionProfile) {
    if (sessionProfile == null) {
        return false;
    }
    Long lastAccess = sessionProfile.getValue(Name.LASTACCESS);
    return System.currentTimeMillis() - lastAccess > EXPIRE_TIME;
}
public synchronized void cleanupContainer(){
集合用户=userCache.values();
for(Userp:users){
如果(isExpired(p)){
过期(p);
}
}
}
专用布尔值isExpired(SessionProfile SessionProfile){
if(sessionProfile==null){
返回false;
}
Long lastAccess=sessionProfile.getValue(Name.lastAccess);
return System.currentTimeMillis()-lastAccess>EXPIRE\u TIME;
}

代码来自我的Web服务。它将每隔5分钟检测一次用户是否需要登录。

在类用户中添加一个字段lastLogin

private static final Long EXPIRE_TIME = 1000L * 60 * 30; //30M
private static final Long DELAY_TIME = 1000L * 60 * 5;
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleWithFixedDelay(new ContainerCleaner(), EXPIRE_TIME, DELAY_TIME, TimeUnit.MILLISECONDS);

public class ContainerCleaner implements Runnable {
    @Override
    public void run() {
        UserCache.cleanupContainer();
    }
}
在用户缓存中

public synchronized void cleanupContainer() {
    Collection<User> users= userCache.values();
    for (Userp : users) {
        if (isExpired(p)) {
            expire(p);
        }
    }
}
private boolean isExpired(SessionProfile sessionProfile) {
    if (sessionProfile == null) {
        return false;
    }
    Long lastAccess = sessionProfile.getValue(Name.LASTACCESS);
    return System.currentTimeMillis() - lastAccess > EXPIRE_TIME;
}
public synchronized void cleanupContainer(){
集合用户=userCache.values();
for(Userp:users){
如果(isExpired(p)){
过期(p);
}
}
}
专用布尔值isExpired(SessionProfile SessionProfile){
if(sessionProfile==null){
返回false;
}
Long lastAccess=sessionProfile.getValue(Name.lastAccess);
return System.currentTimeMillis()-lastAccess>EXPIRE\u TIME;
}


代码来自我的Web服务。它会每5分钟检测一次用户是否使用AlarmManager。

AlarmManager我不太了解它,但我认为它会占用更多的cpu内存。
为什么?我不这么认为。这将是更好的选择..TimerTask在您的情况下是一个很好的选择。如果我使用AlarmManager,如果我的活动进入暂停状态,或者如果我从应用程序中按下home按钮,会发生什么情况。30分钟后alarm manager会发出警报吗
AlarmManager我不太了解它,但我认为它会占用更多的cpu内存。
为什么?我不这么认为。这将是更好的选择..TimerTask在您的情况下是一个很好的选择。如果我使用AlarmManager,如果我的活动进入暂停状态,或者如果我从应用程序中按下home按钮,会发生什么情况。30分钟后,alarm manager会发出警报如果用户进入另一个活动,会发生什么情况。我应该创建新的Handler吗?或者如果屏幕显示关闭,会发生什么情况?我不想要应用程序在用户登录30分钟后注销。如果用户空闲超过30分钟而不触摸屏幕,我只想注销。如果用户转到其他活动,会发生什么情况。我是否应该创建新的Handler或如果屏幕显示消失,会发生什么情况我不希望应用程序在用户登录30分钟后注销。如果用户空闲时间超过30分钟而未触摸屏幕我不希望应用程序在用户登录30分钟后注销。如果用户空闲时间超过30分钟而未触摸屏幕,我只想注销。我不希望应用程序在用户登录30分钟后注销。如果用户停留时间超过30分钟,我只想注销空闲时不触摸屏幕起初我使用处理程序,但我的应用程序经常被强制关闭。因为我必须调用并删除每个事件的处理程序,因为我们无法重置处理程序计时器。最后我使用计时器解决了我的问题。tks sanket。我还有一个疑问。每次单击事件都取消alaram管理器是非常讨厌的(编辑文本单击、父行布局单击、所有按钮单击)。是否有任何方法可以检测用户何时触摸屏幕。我尝试过使用触摸事件、手势等,但它不支持我单击按钮和编辑文本。抱歉,我没有尝试过。如果我得到任何答案,我会告诉你。起初我使用了handler,但。我的应用程序经常被强制关闭。因为我每次都必须调用并删除handlert因为我们无法重置处理程序计时器。最后,我使用计时器解决了我的问题。tks sanket。我还有一个疑问。每次单击事件(编辑文本单击、父行布局单击、所有按钮单击)都取消alaram管理器是非常讨厌的。是否有任何方法可以检测用户何时触摸屏幕。我尝试使用触摸事件、手势等,但它不支持单击按钮和编辑文本。抱歉,我没有尝试过。如果我得到任何答案,我会通知您。