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