Android 计时器不会在旧活动时停止

Android 计时器不会在旧活动时停止,android,android-timer,Android,Android Timer,我在AccountActivity.class上设置了一个计时器,以确保用户不按home按钮,如果不按home按钮,则将启动倒计时以注销用户,或者如果用户锁定其屏幕 但是现在我面临一个问题,因为使用了onPause方法。当我的用户单击调用getaccounttask()方法的按钮时,它会将我的用户重定向到AccountInformationActivity.class,此时onPause方法也会被激活,计时器开始倒计时 是否有任何解决方案可以防止我的AccountInformationActiv

我在
AccountActivity.class
上设置了一个计时器,以确保用户不按home按钮,如果不按home按钮,则将启动倒计时以注销用户,或者如果用户锁定其屏幕

但是现在我面临一个问题,因为使用了
onPause
方法。当我的用户单击调用
getaccounttask()
方法的按钮时,它会将我的用户重定向到
AccountInformationActivity.class
,此时
onPause
方法也会被激活,计时器开始倒计时

是否有任何解决方案可以防止我的
AccountInformationActivity.class
上的
onPause
方法倒计时或取消计时器

我试图在我的意图开始之前取消计时器,但仍然不起作用

我也尝试过使用handler,但遇到了同样的问题,我仍在努力掌握Android的完整工作原理,因此非常感谢您的帮助或解决方案

public class AccountActivity extends AppCompatActivity {

    private Timer timer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_account);
    }

    private class getaccounttask extends AsyncTask<String, Void, String>
    {
      @Override
      protected String doInBackground(String... urlaccount)
      {
        StringBuilder result = new StringBuilder();
        try
        {
            //My Codes
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return result.toString();
      }

      @Override
      protected void onPostExecute(String result)
      {
        Intent intent = new Intent();
        intent.setClass(getApplicationContext(), AccountInformationActivity.class);
        startActivity(intent);
      }
     }

    @Override
    protected void onPause() {
        super.onPause();

        timer = new Timer();
        Log.i("Main", "Invoking logout timer");
        LogOutTimerTask logoutTimeTask = new LogOutTimerTask();
        timer.schedule(logoutTimeTask, 300000); //auto logout in 5 minutes
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (timer != null) {
            timer.cancel();
            Log.i("Main", "cancel timer");
            timer = null;
        }
    }

    private class LogOutTimerTask extends TimerTask {

        @Override
        public void run() {

            //redirect user to login screen
            Intent i = new Intent(AccountActivity.this, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
            finish();
        }
    }
}
公共类AccountActivity扩展了AppCompatActivity{
私人定时器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u账户);
}
私有类getaccounttask扩展了AsyncTask
{
@凌驾
受保护的字符串doInBackground(字符串…URL帐户)
{
StringBuilder结果=新建StringBuilder();
尝试
{
//我的密码
}
捕获(例外e)
{
e、 printStackTrace();
}
返回result.toString();
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
意图=新意图();
setClass(getApplicationContext(),AccountInformationActivity.class);
星触觉(意向);
}
}
@凌驾
受保护的void onPause(){
super.onPause();
定时器=新定时器();
Log.i(“主”,“调用注销计时器”);
LogOutTimerTask logoutTimeTask=新LogOutTimerTask();
timer.schedule(logoutTimeTask,300000);//5分钟后自动注销
}
@凌驾
受保护的void onResume(){
super.onResume();
如果(计时器!=null){
timer.cancel();
Log.i(“主”、“取消计时器”);
定时器=空;
}
}
私有类LogOutTimerTask扩展TimerTask{
@凌驾
公开募捐{
//将用户重定向到登录屏幕
意图i=新意图(AccountActivity.this,MainActivity.class);
i、 添加标志(意图、标志、活动、清除、顶部);
星触觉(i);
完成();
}
}
}

我认为您在活动生命周期中将onPause()和onResume()混淆了。

在您的情况下,您可以将在onPause()中执行的操作切换到onResume()


希望这会有帮助

我认为在活动生命周期中,您混淆了onPause()和onResume()。

在您的情况下,您可以将在onPause()中执行的操作切换到onResume()


希望这会有帮助

嗯,您选择的实现架构可以改进。我以后再谈这个问题。首先应用此快速修复来修复您的体系结构

显然,当您使用主屏幕退出
活动时,您需要启动
计时器。但用户也可以通过使用
Intent
切换到
AccountActivity
退出
Activity
。这是你可以追踪的。因此,保留一个布尔标志,如
shouldNavigate
,最初它应该是
false
。当
onResume
时,应将其设置为
false
,但当
getcounttask
转到
onPostExecute
时,应将其设置为
true
。因此,在
onPause
中,如果您要通过
getcounttask
外出,
shouldNavigate
将是
真的
,如果是
真的
,请取消计时器,否则,启动
计时器

代码:

现在,每个活动都有一个标签(比如它的名称),所以恢复时的每个活动都可以

Singleton.getInstance().activityMap.put(tag, this);
当转到
onPause
时就可以了

Singleton.getInstance().activityMap.remove(tag, this);

因此,当服务发现
Singleton.getInstance().activityMap
的大小为零时,显然前台没有任何活动,因此它会启动一个计时器。当计时器过期时,再次检查计数是否仍然为零,如果为零,则执行注销。

好的,您选择的实现架构可以改进。我以后再谈这个问题。首先应用此快速修复来修复您的体系结构

显然,当您使用主屏幕退出
活动时,您需要启动
计时器。但用户也可以通过使用
Intent
切换到
AccountActivity
退出
Activity
。这是你可以追踪的。因此,保留一个布尔标志,如
shouldNavigate
,最初它应该是
false
。当
onResume
时,应将其设置为
false
,但当
getcounttask
转到
onPostExecute
时,应将其设置为
true
。因此,在
onPause
中,如果您要通过
getcounttask
外出,
shouldNavigate
将是
真的
,如果是
真的
,请取消计时器,否则,启动
计时器

代码:

现在,每个活动都有一个标签(比如它的名称),所以恢复时的每个活动都可以

Singleton.getInstance().activityMap.put(tag, this);
当转到
onPause
时就可以了

Singleton.getInstance().activityMap.remove(tag, this);

因此,当服务发现
Singleton.getInstance().activityMap
的大小为零时,显然前台没有任何活动,因此它会启动一个计时器。计时器过期时,再次检查计数是否仍然为零,如果为零,则执行注销。

onPause()
中进行一些修改并添加此权限

@覆盖
受保护的void onPause(){
如果(是应用程序入口背景(本)){
//做什么
Singleton.getInstance().activityMap.remove(tag, this);
    @Override
    protected void onPause() {
        if (isApplicationSentToBackground(this)) {
            // Do what you want to do on detecting Home Key being Pressed
            timer = new Timer();
            Log.i("Main", "Invoking logout timer");
            LogOutTimerTask logoutTimeTask = new LogOutTimerTask();
            timer.schedule(logoutTimeTask, 300000); //auto logout in 5 minutes
            Log.i("Main", "Invoking Home Key pressed");
        }
        super.onPause();

    }

    public boolean isApplicationSentToBackground(final Context context) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
        if (!tasks.isEmpty()) {
            ComponentName topActivity = tasks.get(0).topActivity;
            if (!topActivity.getPackageName().equals(context.getPackageName())) {
                return true;
            }
        }
        return false;
    }