Android检测应用程序是否进入后台

问题描述:

我试图在Android上为我的应用程序实现一些自动注销代码。Android检测应用程序是否进入后台

我需要检测属于应用程序的所有活动是否已进入后台,而不是针对每个单独的活动使用onPause()onResume()。 iOS有一个我可以利用的有帮助的applicationDidEnterBackground:方法,但我无法在Android的Application类中找到类似的功能。

一种方法似乎是有一个AtomicInteger计数器,并在活动变为可见时递增计数,并在计数结束或onStop()被调用时递减计数。所以如果计数器变为零,我可以启动一个在后台运行的服务并处理注销。这是通常做到的吗?

当用户切换到另一个选项卡或最小化其浏览器窗口时,您确实不希望在“应用程序”在后台进行注销时退出用户,而不是退出Web应用程序的用户片刻。如果您要在Web应用程序中执行这些任何一项操作,那么您的用户会认为您的Web应用程序是史诗般的失败。同样,如果用户拨打了错误号码的电话,或者闹钟响了,他们会很生气,如果他们必须马上回去登录,并且在他们刚刚使用您的应用程序时登录5秒钟。在这里,通过“恼火”,我指的是市场上的一星评级和讨厌的评论。

Web应用程序自动注销基于不活动,使用服务器会话cookie。

同样,当我建立一个安全的Android应用程序,我将实现一个基于活动的机制,或许是这样的:

第1步:用一个静态的单一实例创建Session类。 Session对象保存上次访问的时间戳。

步骤2:在每个活动的onResume()中,查看Session单身是否存在。如果不是,这是一个全新的过程,所以如果这不是身份验证活动,请立即执行startActivity()以启动身份验证活动。

步骤3:返回每个活动的onResume(),如果存在Session对象,请拨打extend()之类的东西。这将返回一个boolean,true表明会话仍然良好(并且时间戳已经更新到现在),否则返回false。如果返回false,请执行与Session对象为null相同的操作。

步骤#4:您的验证活动成功后,使用当前时间戳设置单身人士Session对象。

步骤#5:您的Session分类'extend()方法是您确定会话是否过旧的地方。

无论用户如何进入应用程序,如果会话太旧(或者它是一个全新的进程),它们都会被强制进行身份验证。但是,如果用户暂时中断 - 您和/或用户可以在其中简要定义 - 他们不必重新进行身份验证。

+0

哎呀,这就是我的意思,我想在分钟后自动注销,而不是每次应用程序进入后台时注销。对于类似的问题,其中一个建议是在后台运行一项服务,并将BroadCast发送给我的所有实施广播接收器的活动,但这是一个更好的方法。 – 2011-04-30 19:52:38

+0

@Tejaswi Yerukalapudi:是的,服务和接收方法会相当重量级。 – CommonsWare 2011-04-30 22:02:17

+2

某些应用程序在进入后台时会退出,例如银行应用程序。只是我的意见... – 2012-04-04 09:28:44

对此没有全局回调,但对于每个活动它都是onStop()。你不需要混淆原子int。只需要一个全局的int,其中包含启动活动的数量,每个活动都会在onStart()中增加它,并在onStop()中将其递减。

+4

这个伟大的工程的共享PREF上onCreat。如果您的所有活动都具有基类,那么很容易检测应用程序何时移至前台(计数从0增加到1)以及何时移动到后台(计数达到0)。 – 2012-07-31 14:41:30

+0

这个答案更符合帖子的标题。如果您有兴趣检测应用程序是否进入后台,请考虑这一点。这对我来说很有用。 – 2012-10-31 13:24:02

+0

如果'API> 14''registerActivityLifecycleCallbacks'方法可用于计数器递增/递减 – 2013-07-30 13:47:12

我认为你的建议可能是最好的方法。不幸的是,我不认为有API调用来检测你的应用程序是否在后台。你只需要操作onPause()和onResume()方法。请记住,您需要考虑活动之间的转换,因此一旦您的AtomicInteger达到0,我会等待很短的时间,并重新检查它仍然为0,以确保它不仅仅是转换活动。

创建应用程序类和包括在清单

<application 
     android:name="com.example.hello.MyApplication" 



public class MyApplication extends Application implements 
     ActivityLifecycleCallbacks, ComponentCallbacks2 

重写以下方法

@Override 
public void onTrimMemory(int level) { 
     // this method is called when the app goes in background. 
     // you can perform your logout service here 
     super.onTrimMemory(level); 
    } 

这是有效的API级14及以上。

你甚至可以根据应用程序在后台的时间来执行注销,我建议这是一个更好的选择。这里是你可以做什么来创造的“会话超时”

  1. 保存onTrimMemory(int level)方法

  2. 上所有的活动onStrat(里面SharedPreferences时间戳)从sharedPref得到时间戳和比较它与当前时间。基于此,您可以执行注销。

  3. ,并清除所有MyApplication