深入解析Android系统中应用程序前后台切换的实现要点

2019-12-10 18:07:56丽君

 具体使用方法如下:

public class MyApplication extends Application{ 
  public int count = 0; 
  @Override 
  public void onCreate() { 
    super.onCreate(); 
 
    registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { 
 
      @Override 
      public void onActivityStopped(Activity activity) { 
        Log.v("viclee", activity + "onActivityStopped"); 
        count--; 
        if (count == 0) { 
          Log.v("viclee", ">>>>>>>>>>>>>>>>>>>切到后台 lifecycle"); 
        } 
      } 
 
      @Override 
      public void onActivityStarted(Activity activity) { 
        Log.v("viclee", activity + "onActivityStarted"); 
        if (count == 0) { 
          Log.v("viclee", ">>>>>>>>>>>>>>>>>>>切到前台 lifecycle"); 
        } 
        count++; 
      } 
 
      @Override 
      public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 
        Log.v("viclee", activity + "onActivitySaveInstanceState"); 
      } 
 
      @Override 
      public void onActivityResumed(Activity activity) { 
        Log.v("viclee", activity + "onActivityResumed"); 
      } 
 
      @Override 
      public void onActivityPaused(Activity activity) { 
        Log.v("viclee", activity + "onActivityPaused"); 
      } 
 
      @Override 
      public void onActivityDestroyed(Activity activity) { 
        Log.v("viclee", activity + "onActivityDestroyed"); 
      } 
 
      @Override 
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 
        Log.v("viclee", activity + "onActivityCreated"); 
      } 
    }); 
  } 
} 

除此之外,有没有其他方法可以实现这个功能呢?
当应用切到后台的时候,运行在前台的进程由我们的app变成了桌面app,依据这一点,我们可以实现检测应用前后台切换的功能。在Activity的onStop生命周期中执行检测代码,如果发现当前运行在前台的进程不是我们自己的进程,说明应用切到了后台。
想想为什么要在onStop中检测,而不是onPause?这是由于A启动B时,生命周期的执行顺序如下:A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop,也就是说,在A的onPause方法中,B的生命周期还没有执行,进程没有进入前台,当然是检测不到的。我们把代码移到onPause生命周期中,发现确实没有效果。