判断App运行是否在前台

转自:http://notes.stay4it.com/2016/02/26/check-if-app-is-running-forground/

在一些场景中,经常会需要判断App是否在后台运行,比如是否显示解锁界面,收到新消息是否显示Notification等。

从网上找到的方法大部分都是通过判断runningAppProcess里面是否有该app的进程这样来判断app是否还在运行,但是这种方法有种windows资源管理器的既视感。

经过查找发现,Android在SDK 14的时候提供了一个Callback。ActivityLifecycleCallbacks,你可以通过这个Callback拿到App所有Activity的生命周期回调。看图:

这个Callback写在Application里的,你可以在Application初始化的时候来注册。我们可以写个单例类来cache这些status。这里我叫它AppStatusTracker。在Application的onCreate()里让AppStatusTracker注册ActivityLifecycleCallbacks。

从WelcomeActivity跳转到GestureActivity。回调方法如下:
A.onPause() -> B.onStart() -> B.onResume() -> A.onStop()

通过这些回调我们可以在onStart()和onStop()中进行计数,如果start就+1,onstop就-1,这样可以根据计数是否为0来判断是否是前台了。

现在再说,什么情况下来显示手势解锁界面。
我的需求是当用户锁屏后再解锁或者切换到后台10分钟后显示手势解锁界面。
我们拆分下需求,先说锁屏,解锁。

这个是有BroadCastReciever来接收的,注册下就可以了,每次收到锁屏ACTION_SCREEN_OFF的action时,将AppStatusTracker里的isScreenOff设置为true。
当收到解锁ACTION_SCREEN_ON再将isScreenOff设为false。

再说切换到后台10分钟后显示手势解锁。这个只需要在onActivityStop()时更新下lastBackgroudTimestamp就可以了。

下面是完整的代码:

public class AppStatusTracker implements Application.ActivityLifecycleCallbacks {
    /** 切换到后台的时间戳*/
    public long screenOnTime = 0l;
    /** 当前是否有activity在运行 */
    public int count = 0;
    /** 屏幕点亮*/
    public boolean screenOn = true;
    /** 是否是在后台*/
    public boolean isBackGround = false;
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        LogUtil.e("onActivityCreated");
    }

    @Override
    public void onActivityStarted(Activity activity) {
        LogUtil.e("onActivityStarted");
        LogUtil.e(activity.getClass().getName());
        count++;
    }

    @Override
    public void onActivityResumed(Activity activity) {
        LogUtil.e("onActivityResumed");
        isBackGround = false;
        screenOnTime = 0l;

    }

    @Override
    public void onActivityPaused(Activity activity) {
        LogUtil.e("onActivityPaused");
    }

    @Override
    public void onActivityStopped(Activity activity) {
        LogUtil.e("onActivityStopped");
        count--;
        if(count == 0){
            isBackGround = true;
            screenOnTime = System.currentTimeMillis();
        }
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

        LogUtil.e("onActivitySaveInstanceState");
    }

    @Override
    public void onActivityDestroyed(Activity activity) {

        LogUtil.e("onActivityDestroyed");
    }
}
public class MyApplication extends android.support.multidex.MultiDexApplication {
public static AppStatusTracker tracker = new AppStatusTracker();
    private ScreenOnOffReceiver screenOnOffReceiver = new ScreenOnOffReceiver();
    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
        x.Ext.setDebug(true); // 是否输出debug日志
        LogUtil.customTagPrefix="lpj";

        registerActivityLifecycleCallbacks(tracker);
        registerScreenReceiver();

    }

    private void registerScreenReceiver(){
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);
        registerReceiver(screenOnOffReceiver,intentFilter);
    }

}
原文地址:https://www.cnblogs.com/yiludugufei/p/5442945.html