判断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
原创粉丝点击