Android判断进程在前后台最靠谱的方法

转载请标明出处

http://blog.csdn.net/mohan6/article/details/76177540

本文作者:【默寒的博客】


前言:前段时间做Push的时候,需要判断前后台。尝试网上的好多方法,都不太靠谱。遍历系统中正在运行的进程取第一个和自己的进程包名比较的方法在华为mate8不好使。 (7.0系统,怀疑可能是多任务处理才使得这种判断变的不可靠)。后来直接就避开了前后台判断,直接前后台统一处理了。最近一段时间做统计,需求要统计app被激活的次数,进程从后台进去前台就计数一次。那么必须要做前后台判断了。之前做Push的时候,用下面的方法判断过某个activity是否在前台。只要拿个变量稍作计数,就可以用来判断进程是否在前后台了。废话不多说,直接上代码。

在application中有个registerActivityLifecycleCallbacks的回调,在onCreate()中注册activity的生命周期回调。private int mCount = 0; mCount初始值是0,每有一个activity可见走onActivityStarted(),mCount就++;每有一个activity不可见走onActivityStopped(),mCount就--;这样通过判断mCount就可以知道进程在前后了。onActivityStopped()中如果mCount==0,说明是前台到后台。onActivityStarted()中如果mCount==1,说明是从后台到前台。然后在相应的位置做自己想做的操作就可以。

/**
   * 2017.6.19
   * 判断应用在前后台  ym
   * 2017.6.30 新增判断议价详情页前后台标记  ym
   */
  public void isRunningForeground() {
    if (Build.VERSION.SDK_INT >= 14) {
      registerActivityLifecycleCallbacks(
              new Application.ActivityLifecycleCallbacks() {
                @Override
                public void onActivityCreated(
                        Activity activity, Bundle bundle) {

                }

                @Override
                public void onActivityStarted(Activity activity) {
                  mCount++;
                  //如果mCount==1,说明是从后台到前台
                  if (mCount == 1) {
                    //执行app跳转到前台的逻辑
//                    LogUtil.e("ym", "mCount前台" + mCount);
                    //2017.7.17 友盟统计(App激活) ym start
                    String buyer_mobile = share.getString("buyer_mobile");
                    if (TextUtils.isEmpty(buyer_mobile)) {
                      buyer_mobile = "暂无";
                    }
                    HashMap<String, String> buyerMobileMap = new HashMap<>();
                    buyerMobileMap.put("手机号", buyer_mobile);
//                    LogUtil.e("ym", buyer_mobile);
                    MobclickAgent.onEvent(getApplicationContext(), Contants.Application_Become_Active, buyerMobileMap);
                    //2017.7.17 友盟统计(App激活) ym end
                  }
                }

                @Override
                public void onActivityResumed(Activity activity) {
//                  LogUtil.i("ym", "判断前后台界面:" + activity.getClass().getSimpleName() + "前台");
                  if (TextUtils.equals(activity.getClass().getSimpleName(), "ACT_BargainingDetail")) {
                    Contants.ACT_BargainingDetailFlag = "foreground";
                  }

                }

                @Override
                public void onActivityPaused(Activity activity) {

                }

                @Override
                public void onActivityStopped(Activity activity) {
//                  LogUtil.i("ym", "判断前后台界面:" + activity.getClass().getSimpleName() + "后台");
                  if (TextUtils.equals(activity.getClass().getSimpleName(), "ACT_BargainingDetail")) {
                    Contants.ACT_BargainingDetailFlag = "background";
                  }
                  mCount--;
                  //如果mCount==0,说明是前台到后台
                  if (mCount == 0) {
                    //执行应用切换到后台的逻辑
//                    LogUtil.e("ym", "mCount后台" + mCount);
                  }
                }

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

                }

                @Override
                public void onActivityDestroyed(Activity activity) {

                }
              });

    }
  }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值