gpt4 book ai didi

android - 如何检测用户在一段时间内没有 Activity 并在android中进行多项 Activity

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:27 25 4
gpt4 key购买 nike

我知道同样的问题是 here ,已经有人问过,并且有答案,但我对该答案有疑问。

我的要求是,我想确定用户是否处于非 Activity 状态 5 分钟,然后用户从应用程序自动注销并上传登录和注销登录到服务器。

我已经尝试了上面链接中的所有答案,但该答案适用于单个 Activity ,但我想跟踪它以进行多个 Activity 。

为此我创建了抽象类

public abstract class SessionTimeOutActivity extends BaseActivity {

public static final long DISCONNECT_TIMEOUT = 1000 * 60; // 5 min = 5 * 60 * 1000 ms

private static Handler disconnectHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Log.d("SessionTimeOutActivity", "disconnectHandler");

return false;
}
});

private Runnable disconnectCallback = new Runnable() {
@Override
public void run() {
// Perform any required operation on disconnect
Log.d("SessionTimeOutActivity", "disconnectCallback");


Toast.makeText(getApplicationContext(), "Session time out", Toast.LENGTH_LONG).show();
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
startActivity(intent);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

finish();

}
};

public void resetDisconnectTimer() {
disconnectHandler.removeCallbacks(disconnectCallback);
disconnectHandler.postDelayed(disconnectCallback, DISCONNECT_TIMEOUT);
}

public void stopDisconnectTimer() {
disconnectHandler.removeCallbacks(disconnectCallback);
}

@Override
public void onUserInteraction() {
Log.d("SessionTimeOutActivity", "onUserInteraction");
resetDisconnectTimer();
}

@Override
public void onResume() {
super.onResume();
// resetDisconnectTimer();
}

@Override
public void onStop() {
super.onStop();
// stopDisconnectTimer();
}


}

应用中的其他 Activity

    public class MenuActivtyNav extends SessionTimeOutActivity{
.....
}

菜单 Activity

 public class MenuActivty extends SessionTimeOutActivity{
....
}

问题是

1) 在锁定屏幕自动注销不工作,它不调用 disconnectCallback

2) 在使用应用程序时显示消息“ session 超时”

最佳答案

让我们首先了解您的代码未按预期执行的原因。

问题 1. 您应该避免在 android 上的 Activity 中运行长时间运行的任务,尤其是当它们不可见时,因为系统可能会终止您的 Activity 或应用程序进程,因此代码将无法运行.

问题 2. 每个 Activity 都会将 disconnect 回调发送给您的处理程序,如果用户正在与第二个 Activity 交互,则不会重置第一个 Activity 的回调,并且将触发。

解决方案。

现在让我们考虑一下解决这个问题的方法。最好有一个地方来跟踪不活动。它可以是单例,也可以使用应用程序对象。并分别处理两种情况:第一种是您的用户在应用内但未使用它,另一种是您的用户不在应用中。

对于第一个目标,您可以采用与当前目标类似的方法,但在应用程序中共享 disconnectCallback。将处理程序、回调和重置回调逻辑移动到您的 Application 类并制作您的

@Override
public void onUserInteraction()

在应用程序上调用 resetCallback。这将使所有 Activity 使用相同的回调并解决问题 2。

对于第二个目标,您可以使用 Activity Lifecycle Callbacks .每次您暂停 Activity 时,请保存时间戳。然后每次 Activity 恢复时将此时间戳与恢复时间进行比较,如果大于 5 分钟,则注销您的用户并转到登录屏幕。它将解决问题 1。您需要保留此时间戳,因为应用程序可能会被系统终止并且内存中共享的所有内容都将被删除。例如,使用共享首选项。

最后一件事,您需要在应用程序进入后台时取消回调。您可以在 Activity 回调的 onActivityPaused(Activity activity) 中执行此操作,在您将为第二种情况触发逻辑的同一位置。

关于android - 如何检测用户在一段时间内没有 Activity 并在android中进行多项 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50586648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com