魅力程序猿

  • 首页
  • Java
  • Android
  • APP
    • 扑克计分器
    • Video Wallpaper
  • 联系我
  • 关于我
  • 资助
道子
向阳而生
  1. 首页
  2. Android
  3. 正文

Android中怎么判断是Home键或非正常退出(进入后台)续

2017年4月27日 9177点热度 0人点赞 4条评论

之前写过一遍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键或非正常退出(进入后台)的方法高大上?

 

标签: 判断是Home键或非正常退出(进入后台)
最后更新:2017年4月27日

daozi

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

  • 我赚啦

    闲着没事,随便逛逛,心静自然凉。

    2017年4月30日
    回复
  • 增达网

    受教了!呵呵!

    2017年5月15日
    回复
  • 我赚啦

    古人日三省其身,我从博客里吸收养分!

    2017年5月20日
    回复
  • bernardeda774.livejournal.com

    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..

    2017年5月27日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复
    搜索
    联系方式

    QQ群:179730949
    QQ群:114559024
    欢迎您加入Android大家庭
    本人QQ:136049925

    赐我一丝安慰
    给我一点鼓励

    COPYRIGHT © 2023 魅力程序猿. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    豫ICP备15000477号