美文网首页Android&iOSAndroidAndroid
如何判断一个Android应用程序转到后台并回到前台

如何判断一个Android应用程序转到后台并回到前台

作者: tigergang | 来源:发表于2016-03-25 15:07 被阅读9575次

    我们知道,当我们按返回或Home键退出应用程序的界面时,应用程序会在后台被挂起。这么设计的好处是,由于应用被系统缓存在内存中,那么在用户打开启动应用时就可以通过调用缓存,快速启动应用。当然,由于当今内存和处理器能力的限制,系统会自动关闭一些进程。
    那么我如何判断这个应用程序在前台还是后台,应用从后台回到前台了?
    看到一般都是runningProcess或者runningTasks来判断应用在前台还是后台
    事实上,Android在SDK 14的时候提供了一个Callback。ActivityLifecycleCallbacks,你可以通过这个Callback拿到App所有Activity的生命周期回调。看图:

    public class Application extends android.app.Application {
          private int activityCount;//activity的count数 
          private boolean isForeground;//是否在前台
        @Override    public void onCreate() {   
         super.onCreate();       
      registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {   
            @Override           
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
               }  
             @Override           public void onActivityStarted(Activity activity) { 
                  activityCount++;           
    }           @Override   
                                        public void onActivityResumed(Activity activity) { 
              }  @Override     
                                         public void onActivityPaused(Activity activity) {  
             }     @Override       
                                         public void onActivityStopped(Activity activity) {  
               activityCount--;               if(0==activityCount){ 
                      isForeground=false;               }
               }    @Override  
                                        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {  
             }         @Override  
                                          public void onActivityDestroyed(Activity activity) {
               }       });    }    }
    

    这个Callback写在Application里的,你可以在Application初始化的时候来注册。
    通过这些回调我们可以将这个计数放在onStart()和onStop()中去。activityCount==1,那么就是前台,activityCount==0,那就是后台。这样判断很很简单了吧。

    public abstract  class BaseClass extends AppCompatActivity {  
    判断当前的应用程序是不是在运行
    //需要申请GETTask权限
      private boolean isApplicationBroughtToBackground() { 
           ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);   
         if (!tasks.isEmpty()) {            ComponentName topActivity = tasks.get(0).topActivity;
                if (!topActivity.getPackageName().equals(getPackageName())) {    
                return true;            }        }        return false;    }  
       public boolean wasBackground= false;    //声明一个布尔变量,记录当前的活动背景 
        @Override    public void onPause(){
            super.onPause(); 
           if(isApplicationBroughtToBackground())  
              wasBackground= true;    }   
    public void onResume(){  
          super.onResume();       
     if(wasBackground){//      
                     Log.e("aa","从后台回到前台");        }        wasBackground= false;    }}
    

    相关文章

      网友评论

      • 不要踩蘑菇:onstart的时候去+1是不是不对?生命周期是不是有可能没走到。
      • 526846716f8c:我这样写没作用 ! 是我少了什么东西么 ?
      • 乐之飞于:当我后台切前台需要弹一个页面,用这个方法就不行了吧?(考虑到其他页面拍照和拍视频也会弹这个页面)

      本文标题:如何判断一个Android应用程序转到后台并回到前台

      本文链接:https://www.haomeiwen.com/subject/ubarlttx.html