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

时间:2016-03-04 08:40:59

标签: android android-activity android-applicationinfo

我尝试在用户关闭应用后确定我的应用何时恢复,无论如何,请按主页按钮,后退按钮或切换到其他应用。

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

我尝试在活动中使用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);
      }
  }

6 个答案:

答案 0 :(得分:3)

这个class提供了一个单例来确定&#34;背景中的活动&#34;状态。它使用一个具有阈值(即0.3秒)的计时器来确定活动是否转到后台。

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

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

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

答案 1 :(得分: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上检查相同的变量全部:)是的如果你想使用你的应用程序类而不是默认的应用程序你必须更改manifest.xml

<application
        android:name=".AppService"

多数民众赞成:)

答案 2 :(得分:0)

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

你会得到

TRIM_MEMORY_BACKGROUND = 40;

当您的申请进入后台时。

答案 3 :(得分:0)

您可以在项目中创建Application类以保存项目状态。当任何活动分别暂停时暂停呼叫,同时恢复呼叫恢复方法并保存该类内部的状态。即使一个活动暂停,另一个活动在恢复时,您的班级将知道应用程序的确切状态。或者,您可以在每个活动中以共享偏好保存应用状态的另一种方式可以更改其值。

答案 4 :(得分:0)

我相信你没有必要发布一个代码......据说... 首先记录每个已实现的方法onPause()onDestroy()onStart()以及其他众所周知的Activity方法...... 但是后退按钮不会暂停它,因此onCreate被称为最多 并检查HTML

答案 5 :(得分: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"