如果应用程序在后台运行15分钟,则Android注销

如果应用程序在后台运行15分钟,则Android注销,android,service,background,logout,user-inactivity,Android,Service,Background,Logout,User Inactivity,我需要从我的应用程序注销,如果它进入后台,并在超过15分钟后恢复 请在实施所提供的解决方案后参考代码 public class BaseActivity extends Activity { BaseActivity context; private AlarmManager alarmMgr; private PendingIntent alarmIntent; BaseActivity() { context = this; }

我需要从我的应用程序注销,如果它进入后台,并在超过15分钟后恢复

请在实施所提供的解决方案后参考代码

public class BaseActivity extends Activity {
    BaseActivity context;
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;

    BaseActivity() {
        context = this;
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (alarmMgr != null) {
            alarmMgr.cancel(alarmIntent);
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(BaseActivity.this, SampleBootReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

        alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1 * 30 * 1000, alarmIntent); // 15

    }

    class SampleBootReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "alarm", Toast.LENGTH_SHORT).show();
            Intent intent_login = new Intent(context, SignIn.class);
            intent_login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent_login);
            overridePendingTransition(R.anim.in_from_left, R.anim.out_to_right);
        }
    }
}
您可以将时间(
System.currentTimeMillis
)存储在活动的
onPause()
方法中(例如使用SharedReferences)。在
onResume
-方法中,您可以检查此时间并记录用户是否超过1000*60*15毫秒。

您可以使用此方法在15分钟后安排报警,然后当报警启动时,您可以从应用程序注销。然后,当您再次打开应用程序时,您必须确保取消当前警报,这样您可以确保,如果用户在15分钟内打开应用程序,则不会执行注销。您可以找到一个完整的示例,该方法的优点是您的应用程序不能运行

总结一下,对于复制和粘贴爱好者:

要安排警报,请执行以下操作:

private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
    SystemClock.elapsedRealtime() +
    15 * 60 * 1000, alarmIntent); // 15 minutes
将从系统注销的广播接收器:

public class SampleBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // LOGOUT
    }
}
要取消退出警报,请执行以下操作:

if (alarmMgr!= null) {
    alarmMgr.cancel(alarmIntent);
}
尝试以下代码

//Class level variable 
private boolean inBackground = false;

@Override
public void onResume()
{
     inBackground = false;
}


@Override 
public void onPause()
{
    inBackground = true;
    new CountDownTimer( 900000 , 1000 ) 
    {
         public void onTick(long millisUntilFinished) {}

         public void onFinish() 
         {
             if ( inBackground )
             {
                  // code to logout
             }
         }
    }.start();
}

当应用程序进入后台时,默认控件将位于
onPause()
方法中。在这里,我使用了一个将在15分钟间隔后执行注销操作的工具。

尝试了解有关活动生命周期的更多信息,该工具可从中获得。
您的应用将进入后台,这意味着您当前的活动将进入onpause()状态或onStop()。您需要在这些活动周期中进行编码。在这种状态下,您可以调用alarm Manager,它可以在给定时间执行特定任务,就像您的情况一样,在15分钟后启动应用程序

当然,为什么不。。。!!!请输入代码。我不想签入所有活动。您可以使用该检查创建基本活动,并从中继承所有其他活动。请记住,用户的每个任务终止操作都将停止任何AlarmManager或后台任务。因此,如果您喜欢这样的方式,您应该只在RAM中存储登录状态,以确保在应用程序被终止时重置。如果用户在15分钟内打开应用程序,您如何取消现有计时器?如果你的活动被破坏了,你失去了计时器参考,会发生什么?你可以用聪明的方式来做,想想你自己。您的应用程序中有多少活动?我认为如果您的活动被销毁并再次启动,您可能会遇到问题。因为它们将有两个引用,所以“inBackground”不是一个静态变量,而是一个普通变量,因此如果活动被销毁,那么这个变量也将被销毁。当新活动创建时,这个变量将再次创建。@AdityaArora,我想是的。无论您使用哪种方法,都会发生这种情况。倒计时或报警管理器。如果您继续将应用程序从后台切换到前台,它将继续重新启动。您可以在
onResume()
方法中编写代码来取消倒计时。何时需要在登录时安排报警?否,在活动的onStop()方法中。如果您有不止一次的代码,为了避免重复代码,您可以创建一个超类,其他活动可以从中扩展。在你的onStart()方法中,你必须取消报警。哪个类应该是报警接收器和引导接收器?当我开始登录时会调用onstop另一个活动在onReceive from BroadcastReceiver中你应该注销不登录,不是吗?