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

来源:互联网 发布:下一次金融危机 知乎 编辑:程序博客网 时间:2024/06/15 19:13

转载请标明出处

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) {                }              });    }  }


原创粉丝点击