判断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); } }