繁体   English   中英

Android-如何知道后台运行后何时恢复应用

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

我正在尝试确定用户关闭应用程序后的恢复操作,无论是通过按下主屏幕按钮,后退按钮还是切换到另一个应用程序。

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

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

这个提供了一个单,以确定状态“在后台活动”。 它使用带有阈值(即0.3s)的计时器来确定活动是否进入后台。

必须指出的是,如果用户在阈值(即0.3秒)内恢复活动,则该测试将失败。

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

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

您是完全正确的:)因为一次只能活一个活动,所以您需要在应用程序生命周期中仍然存在的活动:)例如应用程序实例本身,或者您也可以使用共享首选项。 但是,如果您问我,认真使用共享偏好来检查生命周期是错误的选择。

如果我在您的位置,我会去Application类:)这是代码,如果您想做同样的事情:)

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;
    }
}

在您所有的活动中,暂停已设置

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

然后在onResume中检查所有相同的变量:),是的,如果要使用应用程序类而不是默认应用程序,则必须对manifest.xml进行更改

<application
        android:name=".AppService"

就这样 :)

在您的Application重写onTrimMemory(int level) 可能不是最漂亮的方法,但是它对我有用。

你会得到

TRIM_MEMORY_BACKGROUND = 40;

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

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

我相信您无需发布代码...说的是...首先记录每个实现的方法onCreate()onPause()onDestroy()和其他onDestroy()良好的Activity方法...但是返回按钮不仅暂停它会杀死它,因此onCreate被最多调用并检查onStart()

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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM