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()
方法是您确定会话是否过旧的地方。
无论用户如何进入应用程序,如果会话太旧(或者它是一个全新的进程),它们都会被强制进行身份验证。但是,如果用户暂时中断 - 您和/或用户可以在其中简要定义 - 他们不必重新进行身份验证。
对此没有全局回调,但对于每个活动它都是onStop()。你不需要混淆原子int。只需要一个全局的int,其中包含启动活动的数量,每个活动都会在onStart()中增加它,并在onStop()中将其递减。
这个伟大的工程的共享PREF上onCreat。如果您的所有活动都具有基类,那么很容易检测应用程序何时移至前台(计数从0增加到1)以及何时移动到后台(计数达到0)。 – 2012-07-31 14:41:30
这个答案更符合帖子的标题。如果您有兴趣检测应用程序是否进入后台,请考虑这一点。这对我来说很有用。 – 2012-10-31 13:24:02
如果'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及以上。
你甚至可以根据应用程序在后台的时间来执行注销,我建议这是一个更好的选择。这里是你可以做什么来创造的“会话超时”
保存
onTrimMemory(int level)
方法上所有的活动onStrat(里面
SharedPreferences
时间戳)从sharedPref得到时间戳和比较它与当前时间。基于此,您可以执行注销。,并清除所有MyApplication
哎呀,这就是我的意思,我想在分钟后自动注销,而不是每次应用程序进入后台时注销。对于类似的问题,其中一个建议是在后台运行一项服务,并将BroadCast发送给我的所有实施广播接收器的活动,但这是一个更好的方法。 –
2011-04-30 19:52:38
@Tejaswi Yerukalapudi:是的,服务和接收方法会相当重量级。 – CommonsWare 2011-04-30 22:02:17
某些应用程序在进入后台时会退出,例如银行应用程序。只是我的意见... – 2012-04-04 09:28:44