Android 应用内获取当前运行Activity

  • 官方解决方案registerActivityLifecycleCallbacks

类似的

/**
 * 监听Application中Activity生命周期,获取顶部Activity
 */
public class WindowLifecycle implements Application.ActivityLifecycleCallbacks, Closeable {

    private Activity currentActivity;

    public WindowLifecycle(Context context) {
        if (context == null) {
            return;
        }
        if (context instanceof Application) {
            ((Application) context).registerActivityLifecycleCallbacks(this);
        } else {
            ((Application) context.getApplicationContext()).registerActivityLifecycleCallbacks(this);
        }
    }

    /**
     * 获取当前运行的activity
     */
    public Activity getCurrentActivity() {
        Log.i("ActivityLifecycle", "getCurrentActivity");
        return this.currentActivity;
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

    }

    @Override
    public void onActivityStarted(Activity activity) {

    }

    @Override
    public void onActivityResumed(Activity activity) {
        this.currentActivity = activity;
    }

    @Override
    public void onActivityPaused(Activity activity) {
        this.currentActivity = null;
    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

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

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }


    @Override
    public void close() throws IOException {
        if (currentActivity != null) {
            currentActivity = null;
        }
    }

    /**
     * 销毁资源
     */
    public void destroyed() {
        if (currentActivity != null) {
            currentActivity = null;
        }
    }
}
复制代码

通过getCurrentActivity()来获取当前运行activity

  • 反射解决方案
/**
   * 获取当前运行的activity
   */
  public static Activity getTopActivity() {
      Log.i("activity", "[getTopActivity]");
      try {
          Class activityThreadClass = Class.forName("android.app.ActivityThread");
          Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
          Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
          activitiesField.setAccessible(true);
          //16~18 HashMap
          //19~27 ArrayMap
          Map<Object, Object> activities;
          if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
              activities = (HashMap<Object, Object>) activitiesField.get(activityThread);
          } else {
              activities = (ArrayMap<Object, Object>) activitiesField.get(activityThread);
          }
          if (activities.size() < 1) {
              return null;
          }
          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 (Exception e) {
          e.printStackTrace();
      }
      return null;
  }
复制代码

优先使用ActivityLifecycleCallbacks,在lifecycle中获取为空时,再通过反射进行二次获取(lifecycle极地概率获取不到,可能原因是国产rom的activity生命周期出现异常导致)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值