2011-10-19 157 views
1

我必须在应用程序中根据会话维护统计信息。问题在于,即使用户使用后退按钮退出应用程序,也不会关闭应用程序(可能是因为我在后台运行服务)。Android应用程序会话管理

我想重置我的会话信息,如果该应用程序在后台说X分钟(从比如说一个电话或报警相区别)。有没有办法做到这一点?

也许某种类型的广播接收机来检测事件...?

让我试着解释一下这个场景。我的应用程序只有在认证后才能访问(输入密码)。现在一旦用户进入这个部分,我不希望每次活动暂停时都要求用户进行认证。但是,说用户按下主页键并在说20分钟后返回到应用程序,我想要求认证。

编辑:我有多个活动的工作,所以我不能检测应用程序将背景只需在onPause()设置一个标志。

回答

4
private static boolean isApplicationGoingToBackground(final Context context) { 

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

     return false; 
    } 

呼叫中的onStop。 onStop在onStart之后被调用,接管屏幕 - 如果它在同一个apk包中有一个活动,那么你不会进入后台。这确实需要GET_TASKS权限,并且如果某个活动在没有退出的情况下出现,它仍会触发(用户从通知栏中选择某些内容)。

或绑定到服务onStart &取消绑定onStop - 当所有活动都停止时,服务将被onDestroyed(或者如果您不想依赖onDestroyed来取消调用,则绑定vs取消绑定 - 因为它可能不会。 )。

0

我不能完全肯定,但我认为你的应用程序不会关闭,当用户使用后退按钮(除非你正在追赶它别的东西或是在后台运行共享同一会话等业务中存在的应用程序偏好

反正...

要回答你的问题,有两种简单的方法做你想做的事:

  1. 尝试Flurry它的工作非常好或谷歌。针对mo的分析胆汁,他们都很容易使用,他们为你处理。

  2. 如果你想做后台检查,只需在活动的onPause()块中记录一个SharedPreference,当你的应用程序的一部分出现一个新屏幕时刷新它,同时检查旧的已经过期(这会发生在onResume())。

+0

我可以使用Flurry/Google Analytics,但您看到我想重置的信息位于应用程序内部,与报告/跟踪无关。 –

+0

我看到你更新了这个问题。如果您可以准确地保存记录并以正确的方式检测,onPause应该可以正常工作。为了保持简短,请使用SharedPreference保留上次活动时间并刷新它。如果你不能设置onPause(),那很好,只需设置onResume()来检查那个时间。这总是一个有效的例子,因为它必须被买到前台。如果您真的不信任这种方式,请尝试使用AlarmManager,并在每次进行交互并使未决事件使会话无效时刷新警报。有很多方法可以做到这一点,但使用偏好非常简单。 – Edison

+0

请记住,如果您正在进行多项活动,则无关紧要。如果它们是在同一个进程上运行的同一个应用程序,通常会有一个清晰的堆栈。 – Edison