[英]AltBeacon library inconsistent when detecting a beacon after app has been stopped and resumed
[英]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秒)内恢复活动,则该测试将失败。
如果您有更好的解决方案,请与我们分享:)
您是完全正确的:)因为一次只能活一个活动,所以您需要在应用程序生命周期中仍然存在的活动:)例如应用程序实例本身,或者您也可以使用共享首选项。 但是,如果您问我,认真使用共享偏好来检查生命周期是错误的选择。
如果我在您的位置,我会去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.