判断Android app退后台、进前台

在某些特定的场景下,我们需要判断App是否进入后台运行状态。然后根据App处在前台/后台分别进行不同的操作行为。我们可以通过Activity的生命周期来,实现这一需求。
关于生命周期,我们可以分类为三个类别:

1:entire lifetime(完整生命周期)
onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy.
2:visible lifetime(可见生命周期)
onStart -> onResume -> onPause -> onStop
3: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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值