判断Android 应用前后台的几种方式

方法一: 通过Application.ActivityLifecycleCallbacks

API 14之后,在Application类中,提供了一个应用生命周期回调的注册方法,用来对应用的生命周期进行集中管理,这个接口叫registerActivityLifecycleCallbacks,可以通过它注册自己的ActivityLifeCycleCallback,每一个Activity的生命周期都会回调到这里的对应方法

public class ForegroundCallbacks implements Application.ActivityLifecycleCallbacks {
    public static final long CHECK_DELAY = 500;
    public static final String TAG = ForegroundCallbacks.class.getName();

    public interface Listener {
        public void onBecameForeground();

        public void onBecameBackground();
    }

    private static ForegroundCallbacks instance;
    private boolean foreground = false, paused = true;
    private Handler handler = new Handler();
    private List<Listener> listeners = new CopyOnWriteArrayList<Listener>();
    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.d(TAG, "went foreground");

            for (Listener l : listeners) {
                try {
                    l.onBecameForeground();


                } catch (Exception exc) {
                    Log.d(TAG, "Listener threw exception!:" + exc.toString());
                }
            }
        } else {
            Log.d(TAG, "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.d(TAG, "went background");
                    for (Listener l : listeners) {
                        try {
                            l.onBecameBackground();
                        } catch (Exception exc) {
                            Log.d(TAG, "Listener threw exception!:" + exc.toString());
                        }
                    }
                } else {
                    Log.d(TAG, "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 里进行注册监听


        ForegroundCallbacks.init(this);

        ForegroundCallbacks.get().addListener(new ForegroundCallbacks.Listener() {
            @Override
            public void onBecameForeground() {

                isAppForeground =  true;
            }

            @Override
            public void onBecameBackground() {

                isAppForeground = false;
            }
        });

方法二、通过RunningTaskInfo类判断(需要额外权限):

/**
*判断当前应用程序处于前台还是后台
*/
public static boolean isApplicationBroughtToBackground(final Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;

}

需要在AndroidMenitfest.xml文件中添加以下权限

<uses-permission android:name="android.permission.GET_TASKS" /> 

方法三、 通过RunningAppProcessInfo类判断(不需要额外权限)

public static boolean isBackground(Context context) {

ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(context.getPackageName())) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
Log.i("后台", appProcess.processName);
return true;
}else{
Log.i("前台", appProcess.processName);
return false;
}
}
}
return false;
}

方法四、在BaseActivity 中对每一个Activity进行管理

public class ActivityManagerHelper {
    private static ActivityManagerHelper sManager;
    private Stack<WeakReference<Activity>> mActivityStack;

    private ActivityManagerHelper() {
    }

    public static ActivityManagerHelper getManager() {
        if (sManager == null) {
            Class var0 = ActivityManagerHelper.class;
            synchronized(ActivityManagerHelper.class) {
                if (sManager == null) {
                    sManager = new ActivityManagerHelper();
                }
            }
        }

        return sManager;
    }

    public void addActivity(Activity activity) {
        if (this.mActivityStack == null) {
            this.mActivityStack = new Stack();
        }

        this.mActivityStack.add(new WeakReference(activity));
    }

    public boolean deleteActivity(Activity activity) {
        if (activity != null && this.mActivityStack != null) {
            Iterator it = this.mActivityStack.iterator();

            while(it.hasNext()) {
                WeakReference<Activity> activityReference = (WeakReference)it.next();
                Activity temp = (Activity)activityReference.get();
                if (temp == null) {
                    it.remove();
                } else if (temp == activity) {
                    it.remove();
                    return true;
                }
            }
        }

        return false;
    }

    public void checkWeakReference() {
        if (this.mActivityStack != null) {
            Iterator it = this.mActivityStack.iterator();

            while(it.hasNext()) {
                WeakReference<Activity> activityReference = (WeakReference)it.next();
                Activity temp = (Activity)activityReference.get();
                if (temp == null) {
                    it.remove();
                }
            }
        }

    }

    public Activity currentActivity() {
        this.checkWeakReference();
        return this.mActivityStack != null && !this.mActivityStack.isEmpty() ? (Activity)((WeakReference)this.mActivityStack.lastElement()).get() : null;
    }

    public void finishCurrentActivity() {
        Activity activity = this.currentActivity();
        if (activity != null) {
            this.finishSpecificActivity(activity);
        }

    }

    public void finishSpecificActivity(Activity activity) {
        if (this.deleteActivity(activity)) {
            activity.finish();
        }

    }

    public void finishSpecificActivity(Class<?> cls) {
        if (this.mActivityStack != null) {
            Iterator it = this.mActivityStack.iterator();

            while(it.hasNext()) {
                WeakReference<Activity> activityReference = (WeakReference)it.next();
                Activity activity = (Activity)activityReference.get();
                if (activity == null) {
                    it.remove();
                } else if (activity.getClass().equals(cls)) {
                    it.remove();
                    activity.finish();
                }
            }
        }

    }

    public void finishAllActivity() {
        if (this.mActivityStack != null) {
            Iterator var1 = this.mActivityStack.iterator();

            while(var1.hasNext()) {
                WeakReference<Activity> activityReference = (WeakReference)var1.next();
                Activity activity = (Activity)activityReference.get();
                if (activity != null) {
                    activity.finish();
                }
            }

            this.mActivityStack.clear();
        }

    }

    public void exitApp() {
        try {
            this.finishAllActivity();
            System.exit(0);
            Process.killProcess(Process.myPid());
        } catch (Exception var2) {
            var2.printStackTrace();
        }

    }
}

BaseActivity 中的写法

   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityManagerHelper.getManager().addActivity(this);
        }

   protected void onDestroy() {
        super.onDestroy();
        ActivityManagerHelper.getManager().deleteActivity(this);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值