2

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

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

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

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

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

这是我尝试在每个活动中放入的代码(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);
      }
  }
4

6 回答 6

2

此类提供了一个单例来确定“后台活动”状态。它使用具有阈值(即 0.3 秒)的计时器来确定活动是否进入后台。

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

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

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

于 2016-03-04T09:00:16.483 回答
2

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

如果我在你的位置,我会去应用程序类:) 如果你想做同样的事情,这里是代码:)

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 检查相同的变量thats all :) 是的,如果你想使用你的应用程序类而不是默认应用程序,你必须更改 manifest.xml

<application
        android:name=".AppService"

就这样 :)

于 2016-03-04T08:54:49.380 回答
0

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

你会得到

TRIM_MEMORY_BACKGROUND = 40;

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

于 2016-03-04T08:47:39.600 回答
0

您可以在项目中创建 Application 类以保存项目的状态。当任何活动分别在暂停时暂停调用,而在恢复方法上的恢复调用和保存此类内部的状态时。即使一个活动在恢复时暂停另一个活动,您的班级也会知道应用程序的确切状态。或者您可以在每个活动中以共享首选项保存应用程序状态的另一种方式可以更改其值。

于 2016-03-04T08:54:15.003 回答
0

我相信您无需发布代码...话虽如此...首先记录每个已实现的方法onCreate()、、、onPause()onDestroy()其他知名的 Activity 方法...但是后退按钮不只是暂停它会杀死,因此onCreate 被调用最多并检查onStart()

于 2016-03-04T08:55:53.523 回答
0
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"
于 2016-03-04T09:06:00.213 回答