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,则此测试将失败。
如果您有更好的解决方案,请与我们分享:)
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"
我正在尝试确定在用户关闭我的应用程序后何时以任何方式恢复,按主页按钮、后退按钮或切换到另一个应用程序。
我需要做的是在应用程序进入后台时设置一个布尔值,这样,当它恢复时,我知道它之前是在后台,我可以相应地采取行动。
我尝试在活动中使用 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,则此测试将失败。
如果您有更好的解决方案,请与我们分享:)
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"