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

2019-12-10 19:03:02王旭
这篇文章主要为大家详细介绍了Android开发过程中,关于获取当前Activity的一些思考,感兴趣的小伙伴们可以参考一下  

在Android开发过程中,我们有时候需要获取当前的Activity实例,比如弹出Dialog操作,必须要用到这个。关于如何实现由很多种思路,这其中有的简单,有的复杂,这里简单总结一下个人的一些经验吧。

反射

反射是我们经常会想到的方法,思路大概为

  • 获取ActivityThread中所有的ActivityRecord
  • 从ActivityRecord中获取状态不是pause的Activity并返回

    一个使用反射来实现的代码大致如下

    public static Activity getActivity() {
      Class activityThreadClass = null;
      try {
        activityThreadClass = Class.forName("android.app.ActivityThread");
        Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
        Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
        activitiesField.setAccessible(true);
        Map activities = (Map) activitiesField.get(activityThread);
        for (Object activityRecord : activities.values()) {
          Class activityRecordClass = activityRecord.getClass();
          Field pausedField = activityRecordClass.getDeclaredField("paused");
          pausedField.setAccessible(true);
          if (!pausedField.getBoolean(activityRecord)) {
            Field activityField = activityRecordClass.getDeclaredField("activity");
            activityField.setAccessible(true);
            Activity activity = (Activity) activityField.get(activityRecord);
            return activity;
          }
        }
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      } catch (NoSuchMethodException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      } catch (InvocationTargetException e) {
        e.printStackTrace();
      } catch (NoSuchFieldException e) {
        e.printStackTrace();
      }
      return null;
    }
    

    然而这种方法并不是很推荐,主要是有以下的不足: