检测我的应用程序何时离开后台

时间:2015-10-01 08:24:00

标签: android lifecycle

我正在开发一个应用程序,要求用户在他/她离开应用程序或按主页按钮时输入密码。这将适用于所有应用程序活动。 我已经尝试过Activity生命周期 onResume,onRestart等。但是当从一个活动转移到另一个活动时会调用这些活动。 我也尝试过这段代码

@Override
public void onUserLeaveHint() {
    long uiDelta = (System.currentTimeMillis() - userInteractionTime);

    super.onUserLeaveHint();
    Log.i("bThere","Last User Interaction = "+uiLag);
    if (uiDelta < 100)
        Log.i("appname","Home Key Pressed");    
    else
        Log.i("appname","We are leaving, but will probably be back shortly!");  

但是,这不仅在按下主页按钮时在活动之间切换时也会被调用。

关于如何检测离开应用程序的任何想法?

6 个答案:

答案 0 :(得分:0)

您可以检查您的应用是否在后台

1 - 您应该在AndroidManifest.xml中包含android.permission.GET_TASKS

2 - 在您的应用程序类中输入此代码。


public static boolean isApplicationSentToBackground(final Context context) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List tasks = am.getRunningTasks(1);
    if (!tasks.isEmpty()) {
      ComponentName topActivity = tasks.get(0).topActivity;
      if (!topActivity.getPackageName().equals(context.getPackageName())) {
        return true;
      }
    }

    return false;
  }

答案 1 :(得分:0)

您可以在意图上发送一个额外的布尔值,这些意图执行您的活动之间的流程,表明不应该请求密码请求。然后在您的活动onResume上使用此布尔值一次并将其翻转为假,以便下次恢复活动时将再次请求密码。这应该工作我想。如果有,请告诉我们:)

答案 2 :(得分:0)

用户在“活动”之间切换时删除历史记录。所以他不能使用后退按钮。

答案 3 :(得分:0)

当我想在不再使用应用程序或在后台模式下断开聊天服务器连接时,我也有类似的问题。在iOS中有一个方法

 didEnterInBackground()

用于检测应用程序何时处于后台。我在android中寻找类似的行为,但最终使用解决方法来解决。

所以解决了我的问题的解决方案是,我在每个活动的onPause和onResume上添加计时器。在主机活动的onPause上启动计时器,并在目标活动的onResume上停止计时器。因此,如果没有目标活动(后台应用程序或其他应用程序进入),它将自动断开聊天服务器。

  timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            disconnectChatServer();
        }
    },1000);

您可以调整延迟,以毫秒为单位。

答案 4 :(得分:0)

/**
* 
* @param context
* @return 
*/
public static boolean isBackground(Context context) {    
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
    for (RunningAppProcessInfo appProcess : appProcesses) {
        if (appProcess.processName.equals(context.getPackageName())) {
            if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
                Log.i(String.format("Background App:", appProcess.processName));
                return true;
             }else{
                Log.i(String.format("Foreground App:", appProcess.processName));
                return false;
             }
        }
    }
    return false;
}

答案 5 :(得分:0)

点击活动或主页按钮时,

Activity的生命周期方法,用于调用的onPause()方法。如果应用程序需要内存用于其他操作,则转移到onStop()方法。

如果我已经澄清你的问题,请告诉我。

感谢。