Android - 如何知道应用程序在后台后何时恢复

Android - How to know when app has been resumed after being in background

我正在尝试确定在用户关闭我的应用程序后何时以任何方式恢复,按主页按钮、后退按钮或切换到另一个应用程序。

我需要做的是在应用程序进入后台时设置一个布尔值,这样,当它恢复时,我知道它之前是在后台,我可以相应地采取行动。

我尝试在活动中使用 onResume 和 onPause 方法来了解应用程序何时进入后台,然后恢复,但由于当时只有一个 activity 可以活动,所以我没有成功。当一个 activity 暂停时,这并不意味着应用程序进入后台,因为另一个 activity 可能已经启动,但那个 activity 的 onResume 事件只会在上一个暂停了。

我也试过在前台列出所有应用程序,但没有成功,如果我将我的应用程序置于后台恢复另一个应用程序,我的应用程序总是在前台。

我读到自 Android 4 以来有一种新方法可以知道应用程序何时处于前台,但我也需要我的应用程序与 Android 3.0 设备兼容。

这是我尝试放入每个 activity 的代码(MyApp 是我的应用程序名称):

@Override
protected void onResume() {
    super.onResume();
    MyApp.isPaused = false;
}

@Override
protected void onPause() {
    super.onPause();
    MyApp.isPaused = true;
}

这也是我在前台列出所有应用程序的尝试:

ActivityManager activityManager = (ActivityManager)((Activity) currentContext).getSystemService( ACTIVITY_SERVICE );
  List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
  for(RunningAppProcessInfo appProcess : appProcesses){
      if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
          if(appProcess.processName.equals("com.xxx.myapp")) {
               Log.i("MyApp", "it's in foreground");
          }
          Log.i("MyApp", appProcess.processName);
      }
  }

覆盖 Application 中的 onTrimMemory(int level)。可能不是最漂亮的方式,但它对我有用。

你会得到

TRIM_MEMORY_BACKGROUND = 40;

当您的应用程序进入后台时。

您可以在项目中创建应用程序 class 以保存项目状态。当任何 activity 分别在暂停时调用暂停,而在恢复时调用 resume 方法并保存此 class 内部的状态。即使一个 activity 继续暂停另一个继续你的 class 将知道应用程序的确切状态。或者另一种方法可以将应用程序状态保存在共享首选项中,每个 activity 都可以更改其值。

你完全正确 :) 因为一次只能有一个 activity 存活,所以你需要在整个应用程序生命周期中保持存活的东西 :) 比如 Application 实例本身,或者你也可以使用对此事的共同偏好。但是如果你问我,认真使用共享偏好来检查生命周期是错误的选择。

如果我处于你的位置,我会去申请 class :) 如果你想这样做,这里是代码 :)

import android.app.Application;

/**
 * Created by sandeepbhandari on 3/3/16.
 */
public class AppService extends Application{
    private static AppService sInstance;
    public static boolean isGoingToBackGround=false;

    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
    }

    public static AppService getInstance() {
        return sInstance;
    }
}

在你所有的 onPause 活动中设置

AppService service = AppService.getInstance();
        service.isGoingToBackGround =true;

并且在 onResume 中检查相同的变量,这就是所有 :) 是的,如果您想使用您的应用程序 class 而不是默认应用程序,您必须更改为 manifest.xml

<application
        android:name=".AppService"

就这些:)

我相信你没有必要 post 一个密码……话虽这么说…… 首先记录每个已实现的方法 onCreate()onPause()onDestroy() 和其他知名的 Activity 方法... 但是后退按钮不只是暂停它杀死,因此 onCreate 被调用最多 并检查 onStart()

class 提供了一个单例来确定 "the activity in background" 状态。它使用带有阈值(即 0.3s)的计时器来确定 activity 是否进入后台。

需要指出的是,如果用户在阈值(即0.3s)内恢复到activity,则此测试将失败。

如果您有更好的解决方案,请与我们分享:)

参考:https://gist.github.com/steveliles/11116937

public class CustomApplication extends Application {
    private static boolean activityVisible;
    @Override
    public void onCreate() {
        super.onCreate();

    }

    public static boolean isActivityVisible() {
        return activityVisible;
    }

    public static void activityResumed() {
        activityVisible = true;
    }

    public static void activityPaused() {
        activityVisible = false;
    }
}

并在您的所有活动中设置

@Override
    protected void onResume() {
        super.onResume();
        CustomApplication.activityResumed();
    }

    @Override
    protected void onPause() {
        super.onPause();
        CustomApplication.activityPaused();
    }

并在您的清单中

<application
        android:name=".CustomApplication"