判断Android app退后台、进前台
来源:互联网 发布:linux日志查看技巧 编辑:程序博客网 时间:2024/04/27 19:53
在某些特定的场景下,我们需要判断App是否进入后台运行状态。然后根据App处在前台/后台分别进行不同的操作行为。我们可以通过Activity的生命周期来,实现这一需求。
关于生命周期,我们可以分类为三个类别:
1:entire lifetime(完整生命周期)onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy.2:visible lifetime(可见生命周期)onStart -> onResume -> onPause -> onStop3:foreground lifetime(前台生命周期)onResume -> onPause
根据上面,当应用处于前台,当前Activity一定调用了onResume方法,而应用进入后台时,一定会调用onPause方法。根据这个原理,我们利用Activity生命周期来判断应用的前后台运行状态。很轻松的获取了各种情境下应用的前后台状态变换。
上代码:
package mo.yumf.com.myviews;import android.app.Activity;import android.app.Application;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.util.Log;import java.util.List;import java.util.concurrent.CopyOnWriteArrayList;/** * 在Application类中监听App处于前台和后台 */public class ForegroundCallbacks implements Application.ActivityLifecycleCallbacks { public static final long CHECK_DELAY = 500; public static final String TAG = ForegroundCallbacks.class.getName(); public interface Listener { void onBecameForeground(); void onBecameBackground(); } private static ForegroundCallbacks instance; private boolean foreground = false, paused = true; private Handler handler = new Handler(); private List<Listener> listeners = new CopyOnWriteArrayList<>(); private Runnable check; public static ForegroundCallbacks init(Application application){ if (instance == null) { instance = new ForegroundCallbacks(); application.registerActivityLifecycleCallbacks(instance); } return instance; } public static ForegroundCallbacks get(Application application){ if (instance == null) { init(application); } return instance; } public static ForegroundCallbacks get(Context ctx){ if (instance == null) { Context appCtx = ctx.getApplicationContext(); if (appCtx instanceof Application) { init((Application)appCtx); } throw new IllegalStateException( "Foreground is not initialised and " + "cannot obtain the Application object"); } return instance; } public static ForegroundCallbacks get(){ if (instance == null) { throw new IllegalStateException( "Foreground is not initialised - invoke " + "at least once with parameterised init/get"); } return instance; } public boolean isForeground(){ return foreground; } public boolean isBackground(){ return !foreground; } public void addListener(Listener listener){ listeners.add(listener); } public void removeListener(Listener listener){ listeners.remove(listener); } @Override public void onActivityResumed(Activity activity) { paused = false; boolean wasBackground = !foreground; foreground = true; if (check != null) handler.removeCallbacks(check); if (wasBackground){ Log.e("yumf","went foreground"); for (Listener l : listeners) { try { l.onBecameForeground(); } catch (Exception exc) { Log.e("yumf","Listener threw exception!"); } } } else { Log.e("yumf","still foreground"); } } @Override public void onActivityPaused(Activity activity) { paused = true; if (check != null) handler.removeCallbacks(check); handler.postDelayed(check = new Runnable(){ @Override public void run() { if (foreground && paused) { foreground = false; Log.e("yumf","went background"); for (Listener l : listeners) { try { l.onBecameBackground(); } catch (Exception exc) { Log.e("yumf","Listener threw exception!", exc); } } } else { Log.e("yumf","still foreground"); } } }, CHECK_DELAY); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} @Override public void onActivityStarted(Activity activity) {} @Override public void onActivityStopped(Activity activity) {} @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} @Override public void onActivityDestroyed(Activity activity) {}}
在Application类中:
public class MyApplication extends Application { private int mCount; @Override public void onCreate() { super.onCreate(); ForegroundCallbacks callbacks = ForegroundCallbacks.get(this); callbacks.addListener(new ForegroundCallbacks.Listener() { @Override public void onBecameForeground() { Log.i("yumf","====foreground"); } @Override public void onBecameBackground() { Log.i("yumf","====background"); } }); }}
0 0
- 判断Android app退后台、进前台
- 如何判断Android app退后台、进前台
- android app前后台判断
- Android判断App是否在前台运行
- Android判断App是否在前台运行
- Android判断App是否在前台运行
- Android判断App是否在前台运行
- Android判断App是否在前台运行
- Android判断App是否在前台运行
- Android判断App是否在前台运行
- Android判断APP是否在前台运行
- Android 判断app是否运行在后台
- Android 判断app是否在前台运行
- Android判断App是否在前台运行
- android判断app前后台状态
- Android 判断App是否在前台运行
- Android 判断App前后台运行状态
- 判断Android APP是否在前台运行
- mysql建表外键约束的问题
- Gson 转换long到科学计数法的解决方法
- 同步、异步、阻塞和非阻塞
- Eclipse 的安装与汉化
- 关于FSO没有权限使用的问题。
- 判断Android app退后台、进前台
- iOS 面试题(15):简单介绍 ARC 以及 ARC 实现的原理 -- by唐巧
- 第23节 html页面过渡效果
- 《用python写网络爬虫》笔记1
- Java反射之基础篇
- JavaScript中的IIFE模式
- 正向代理与反向代理的区别
- MyEclipse中配置Struts2配置文件自动提示
- PageAdapter