利用系统自带的API判断应用程序是否在后台运行

一般情况下判断app是否在后台运行主要通过系统服务Context.ACTIVITY_SERVICE获取activityManager,然后再通过遍历当前应用的进程信息来判断是否在后台运行,比如如下方法:

public static boolean isBackground(Context context) {  
        ActivityManager activityManager = (ActivityManager) context  
                .getSystemService(Context.ACTIVITY_SERVICE);  
        List<RunningAppProcessInfo> appProcesses = activityManager  
                .getRunningAppProcesses();  
        for (RunningAppProcessInfo appProcess : appProcesses) {  
            if (appProcess.processName.equals(context.getPackageName())) {  
               
                if (appProcess.importance != RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {  
                         return true;  //处于后台
                } else {  
                  
                    return false;  //处于前台
                }  
            }  
        }  
        return false;  
    }  

这种方法也是比较通用的方法,但是有一个缺点,就是效率可能会差一些,因为要遍历进程信息。

如果想要用优雅一些的方式来处理的话也是可以的,我们可以利用Google提供的另外一个api来实现。Android sdk 14版本开始,官方提供了一个回调:ActivityLifecycleCallbacks,利用这个回调可以检测到应用内所有activity的生命周期,因为这个回调本身定义了activity的所有生命周期方法!

public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }

那么如何使用这个回调实现上文讲到的前后台切换的监听处理呢?

需要说明的是,ActivityLifecycleCallbacks回调的注册和监听都需要在自定义的application中进行,所以需要预先自定义一个application。

首先定义一个计数器count=0;至于为甚么要使用计数器,后续会有说明

oncreate方法中调用registerActivityLifecycleCallbacks()方法注册回调,代码如下:

this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            }

            @Override
            public void onActivityStarted(Activity activity) {
                

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {
//                Toast.makeText(activity,"应用程序进入后台",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onActivityStopped(Activity activity) {
                
                

            }

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

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });

然后重写onActivityStarted和onActivityStopped,在onActivityStarted中让计数器+1;在onActivityStopped中让计数器-1;

onActivityStopped中判断计数器是否=0,如果计数器==0,说明程序运行在后台。代码如下

@Override
public void onActivityStarted(Activity activity) {
       count+=1;

}
@Override
public void onActivityStopped(Activity activity) {
       count-=1;
       if(count==0){
           Toast toast=Toast.makeText(activity,"",Toast.LENGTH_LONG);
           toast.setText("应用程序进入后台");
           toast.show();//这种方式的toast可以去掉默认的前缀
          }
}

之所以要定义计数器并且有一个加减的操作是因为,如果只是单纯使用两个生命周期方法判断的话会出现问题。比如两个AB页面之间跳转,如果不用计时器判断,就会出现A跳转到B之后也会有toast提示的现象,因为A页面跳转到B页面的时候会执行onActivityStopped方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值