判断app 在前后台的问题

今天在写推送的时候需要判断app 在前后台的问题。
1.网络上普遍是用的两种方式,不是太好,会时不时的出问题,并且在5.0 + 的系统上回判断错误所以在google 以后找到了一个比较好的的方案。
2.老外博客地址
(在android 4.0+ 以上有个 Application.registerActivityLifecycleCallbacks
当你在Application中注册了你自定义的ActivityLifecycleCallbacks类之后,每访问一个Activity,该Activity的生命周期方法回调的同时,ActivityLifecycleCallbacks中对应的方法也会回调。我们以onActivityResumed和onActivityPaused为例(我觉得使用onActivityStarted和onActivityStopped也同样有效)

当onActivityResumed回调的时候,表示App当前肯定有一个Activity是用户可见的,那么此时App肯定是运行在前台
当onActivityPaused回调的时候要分为几种情况了:
Activity的切换,前一个Activity会调用onPause
用户按Home键隐藏了App
用户一直back键退出了应用
后两种情况肯定是App进入了后台,第一种情况则不是,此时我们需要在onActivityPaused的实现中调用用handler.postDelayed一个runnable去检查onActivityResumed是否再次回调即可,若回调了,表示App依然运行在前台,若没有,表示App已经进入后台。handler的delay设置为500ms或者1s都可以,这里要着重说明一下,这个延时值的设置不一定对每个Android手机都有效,对于卡顿比较严重的手机,时间可能要更长一些,但是对于大部分手机,500ms到1s还是比较合适的。
)

下面就是我自己写的一个

**
 * 判断app 处于前后台
 * 
 * @data 这里的现实需要api14 以上的支持 也就是必须要在4.0 系统以上使用
 * 
 * 
 * @author Administrator
 *
 */

public class Foreground implements ActivityLifecycleCallbacks {

    private static Foreground instance;

    private boolean paused = true;
    private Handler handler = new Handler();
    private Runnable check;

    // TODO 使用单例模式来操作

    public static void init(Application app) {
        if (instance == null) {
            instance = new Foreground();
            app.registerActivityLifecycleCallbacks(instance);
        }
    }

    public static Foreground get() {
        return instance;
    }

    private Foreground() {
    }

    // TODO: implement the lifecycle callback methods!

    private boolean foreground ;

    public boolean isForeground() {
        return foreground;
    }

    public boolean isBackground() {
        return !foreground;
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onActivityStarted(Activity activity) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onActivityResumed(Activity activity) {
        // TODO Auto-generated method stub
        paused = false;
        foreground = true;
        if (check != null) {
            handler.removeCallbacks(check);
        }
    }

    @Override
    public void onActivityPaused(Activity activity) {
        // TODO Auto-generated method stub
        paused = true;
        if (check != null) {
            handler.removeCallbacks(check);
        }
        handler.postDelayed(check = new Runnable() {
            @Override
            public void run() {
                if (foreground && paused) {
                    foreground = false;
                } 
            }
        }, 1000);
    }

    @Override
    public void onActivityStopped(Activity activity) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        // TODO Auto-generated method stub

    }

}
/**
     * 是否在前台
     * @return  1 是 0 不是
     */
    public static int getIsBackground(){
         boolean b = Foreground.get().isBackground();

         if(b){
             return 0;
         }else{
             return 1;
         }
    }

在需要用到的类中调用这个方法就可以了。
但是这个要放到服务中来进行监控,否则还是不能判断是否可以。
简单说下服务中的操作:
使用Timer 和TimerTask 来进行获取状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值