• 判断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);
        }
    
    }
  • 相关阅读:
    linux基础命令之一
    Chrome 控制台使用大全
    移动端效果 — 页面引入在线视频
    移动端——简单计分表单
    JS操作cookie
    移动端页面字体——rem的使用
    Highcharts 使用总结
    CSS水平居中
    python学习 day2
    python学习 day1
  • 原文地址:https://www.cnblogs.com/yiludugufei/p/5442945.html
Copyright © 2020-2023  润新知