Android开发中关于获取当前Activity的一些思考

2019-12-10 19:03:02王旭
  • 反射通常会比较慢
  • 不稳定性,这个才是不推荐的原因,Android框架代码存在修改的可能性,谁要无法100%保证mActivities,paused固定不变。所以可靠性不是完全可靠。

    Activity基类

    既然反射不是很可靠,那么有一种比较可靠的方式,就是使用Activity基类。

    在Activity的onResume方法中,将当前的Activity实例保存到一个变量中。

    public class BaseActivity extends Activity{
    
      @Override
      protected void onResume() {
        super.onResume();
        MyActivityManager.getInstance().setCurrentActivity(this);
      }
    }
    
    

    然而,这一种方法也不仅完美,因为这种方法是基于约定的,所以必须每个Activity都继承BaseActivity,如果一旦出现没有继承BaseActivity的就可能有问题。

    回调方法

    介绍了上面两种不是尽善尽美的方法,这里实际上还是有一种更便捷的方法,那就是通过Framework提供的回调来实现。

    Android自 API 14开始引入了一个方法,即Application的registerActivityLifecycleCallbacks方法,用来监听所有Activity的生命周期回调,比如onActivityCreated,onActivityResumed等。

    So,一个简单的实现如下

     

    public class MyApplication extends Application {
    
    
      @Override
      public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
          @Override
          public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    
          }
    
          @Override
          public void onActivityStarted(Activity activity) {
    
          }
    
          @Override
          public void onActivityResumed(Activity activity) {
            MyActivityManager.getInstance().setCurrentActivity(activity);
          }
    
          @Override
          public void onActivityPaused(Activity activity) {
    
          }
    
          @Override
          public void onActivityStopped(Activity activity) {
    
          }
    
          @Override
          public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    
          }
    
          @Override
          public void onActivityDestroyed(Activity activity) {
    
          }
        });
      }
    }