之前写过一遍Android中怎么判断是Home键或非正常退出(进入后台),这里讲的方法觉得有点low,在API 14+ (Android 4.0+)之后提供了Application.ActivityLifecycleCallbacks这个类,Application通过ActivityLifecycleCallbacks使用接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理。 ActivityLifecycleCallbacks接口回调可以简化监测Activity的生命周期事件,在一个类中作统一处理。继承这个类在
    @Override
    public void onActivityResumed(Activity activity) {
    }
    @Override
    public void onActivityPaused(Activity activity) {
    }这两个方法里进行处理,便可以进行监听切到后台或切回前台。
ForegroundCallbacks.java代码实现。
package com.aoaoyi.commonutil.foreground;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import com.aoaoyi.commonutil.MLog;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
 * Created by yuzhenbei on 2017/4/27.
 */
public class ForegroundCallbacks implements Application.ActivityLifecycleCallbacks {
    public static final String TAG = ForegroundCallbacks.class.getName();
    public static final long CHECK_DELAY = 500;
    private volatile static ForegroundCallbacks mInstance;
    private boolean mForeground = false, mPaused = true;
    private Handler mHandler = new Handler();
    private List<Listener> mListeners = new CopyOnWriteArrayList<>();
    private Runnable mCheck;
    public static ForegroundCallbacks getInstance(Application pApplication){
        if (mInstance == null) {
            synchronized(ForegroundCallbacks.class){
                if (mInstance == null) {
                    mInstance = new ForegroundCallbacks();
                    register(pApplication);
                }
            }
        }
        return mInstance;
    }
    public static ForegroundCallbacks getInstance(Context pContext){
        if (mInstance == null) {
            Context appCtx = pContext.getApplicationContext();
            if (appCtx instanceof Application) {
                getInstance((Application)appCtx);
            }
            throw new IllegalStateException(
                    "Foreground is not initialised and " +
                            "cannot obtain the Application object");
        }
        return mInstance;
    }
    public boolean isForeground(){
        return mForeground;
    }
    public boolean isBackground(){
        return !mForeground;
    }
    public void addListener(Listener listener){
        mListeners.add(listener);
    }
    public void removeListener(Listener listener){
        mListeners.remove(listener);
    }
    private static void register(Application pApplication){
        if (null == pApplication){
            return;
        }
        if (null == mInstance) {
            return;
        }
        pApplication.registerActivityLifecycleCallbacks(mInstance);
    }
    public void unregister(Application pApplication){
        if (null == pApplication){
            return;
        }
        if (null == mInstance) {
            return;
        }
        try {
            mListeners.clear();
            pApplication.unregisterActivityLifecycleCallbacks(mInstance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onActivityResumed(Activity activity) {
        mPaused = false;
        boolean wasBackground = !mForeground;
        mForeground = true;
        if (mCheck != null)
            mHandler.removeCallbacks(mCheck);
        if (wasBackground){
            MLog.d ("went Foreground");
            for (Listener listener : mListeners) {
                try {
                    listener.onBecameForeground();
                } catch (Exception exc) {
                    MLog.d ("Listener threw exception!:"+exc.toString());
                }
            }
        } else {
            MLog.d ("still Foreground");
        }
    }
    @Override
    public void onActivityPaused(Activity activity) {
        mPaused = true;
        if (mCheck != null)
            mHandler.removeCallbacks(mCheck);
        mHandler.postDelayed(mCheck = new Runnable(){
            @Override
            public void run() {
                if (mForeground && mPaused) {
                    mForeground = false;
                    MLog.d ("went background");
                    for (Listener listener : mListeners) {
                        try {
                            listener.onBecameBackground();
                        } catch (Exception exc) {
                            MLog.d ("Listener threw exception!:"+exc.toString());
                        }
                    }
                } else {
                    MLog.d ("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) {}
    public interface Listener {
        void onBecameForeground();
        void onBecameBackground();
    }
}
在Application 里进行使用
package com.aoaoyi.testcb;
import android.support.multidex.MultiDex;
import android.support.multidex.MultiDexApplication;
import com.aoaoyi.commonutil.MLog;
import com.aoaoyi.commonutil.foreground.ForegroundCallbacks;
/**
 * Created by yuzhenbei on 2017/4/20.
 */
public class CBApplication extends MultiDexApplication {
    private static final String TAG = CBApplication.class.getSimpleName();
    @Override
    public void onCreate() {
        MultiDex.install(getApplicationContext());
        super.onCreate();
        //监听APP进入后台或切回前台
        addAppForegroundListener();
    }
    @Override
    public void onLowMemory() {
        MLog.d(TAG, "LowMemory");
        //System.gc();
        super.onLowMemory();
    }
    @Override
    public void onTerminate() {
        MLog.d(TAG, "Terminate");
        ForegroundCallbacks.getInstance(this).unregister(this);
        super.onTerminate();
    }
    /**
     * 监听APP进入后台或切回前台
     */
    private void addAppForegroundListener(){
        ForegroundCallbacks.getInstance(this).addListener(new ForegroundCallbacks.Listener() {
            @Override
            public void onBecameForeground() {
                //切回前台
                MLog.d(TAG, "BecameForeground");
            }
            @Override
            public void onBecameBackground() {
                //切到后台
                MLog.d(TAG, "BecameBackground");
            }
        });
    }
}
是不是比Android中怎么判断是Home键或非正常退出(进入后台)的方法高大上?
文章评论
闲着没事,随便逛逛,心静自然凉。
受教了!呵呵!
古人日三省其身,我从博客里吸收养分!
I'm really impressed together with your writing abilities and also with the
layout for your weblog. Is this a paid subject or did you modify it your self?
Either way stay up the nice quality writing, it's uncommon to peer
a nice weblog like this one nowadays..