Android获取栈顶Activity便捷工具

通过Application regist ActivityLifecycleCallbacks,监听栈顶Activity
不建议在onNewIntent、onRestart中处理当前UI,因为目标Activity仍未显示

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.annotation.RequiresPermission;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
public class TopActivityManager implements Application.ActivityLifecycleCallbacks {

    private Reference<Activity> mCurActivity = null;

    public static TopActivityManager getInstance() {
        return SingleHolder.mInstance;
    }

    static class SingleHolder {
        static final TopActivityManager mInstance = new TopActivityManager();
    }

    private TopActivityManager() {
    }

    private Reference<Application> mApplication = null;

    public void init(Application app) {
        app.registerActivityLifecycleCallbacks(this);
        mApplication = new WeakReference<>(app);
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        if (mCurActivity != null && mCurActivity.get() != null) {
            mCurActivity.clear();
            mCurActivity = null;
        }

        mCurActivity = new WeakReference<>(activity);
        isTargetPrepared = true;
    }

    private boolean isTargetPrepared = true;// 目标页面是否可见

    @Override
    public void onActivityStarted(Activity activity) {
        if (mCurActivity != null && mCurActivity.get() != null && !mCurActivity.get().equals(activity)) {
            mCurActivity.clear();
            mCurActivity = null;
        }

        if (mCurActivity == null || mCurActivity.get() == null) {
            mCurActivity = new WeakReference<>(activity);
        }
        isTargetPrepared = true;
    }

    @Override
    public void onActivityResumed(Activity activity) {
    }

    @Override
    public void onActivityPaused(Activity activity) {
        if (activity != null) {
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {// 允许onPause使用
                    isTargetPrepared = false;
                }
            });
        }
    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

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

    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        if (mCurActivity != null && mCurActivity.get() != null && mCurActivity.get().equals(activity)) {
            mCurActivity.clear();
            mCurActivity = null;
        }
    }

    public static Context getContext() {
        Context context = null;
        if (getInstance().mApplication != null) {
            context = getInstance().mApplication.get();
        }
        if (context == null && getInstance().mCurActivity != null) {
            context = getInstance().mCurActivity.get().getApplication();
        }
        if (context == null){
            context = YaboLib.getApp();
            getInstance().mApplication = new WeakReference<>(XXXApplication.getApp());
        }
        if (context == null){
            Log.e("TopActivity警告:", "请先注册该组件");
        }
        return context;
    }

    @Deprecated
    public Activity getCurActivity() {
        return getTopActivity();
    }

    private static void debugWarning(String issue) {
        if (BuildConfig.DEBUG) {
            Log.e("TopActivity警告:", issue);
            Toast.makeText(getContext(), issue, Toast.LENGTH_LONG).show();
        }
    }

    /**
     * 判断Activity实例是否为栈顶Activity
     *
     * @param activity 活动页面
     * @return boolean
     */
    public static boolean isTopOfTask(Activity activity) {
        try {
            String meName = "isTopOfTask";
            Method isTopOfTaskM = Activity.class.getDeclaredMethod(meName, (Class<?>) null);
            isTopOfTaskM.setAccessible(true);
            Object object = isTopOfTaskM.invoke(activity, (Object) null);
            if (object instanceof Boolean) {// 不是TopActivity提醒
                return (Boolean) object;
            }
        } catch (Exception ignored) {
        }
        return false;
    }

    /**
     * 获取栈顶Activity
     * 页面跳转有对应方法
     *
     * @return Activity
     */
    public static Activity getTopActivity() {
        if (getInstance().mCurActivity != null) {
            Activity activity = getInstance().mCurActivity.get();
            if (activity != null) {
                if (!getInstance().isTargetPrepared) {
                    debugWarning("请勿在onNewIntent onRestart 生命方法中调用,目标Activity 还未显示");
                }
                return activity;
            }
        }
        debugWarning("组件未注册 or TopActivity在后台已被系统回收");
        return null;
    }

    public static void startActivity(Intent intent) {
        startActivity(intent, null);
    }

    public static void startActivity(Intent intent, Bundle bundle) {
        Context context = getContext();
        if (context != null) {
            context.startActivity(intent, bundle);
        }
    }

    public static void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
        startActivityForResult(intent, requestCode, null);
    }

    public static void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
        Activity activity = getTopActivity();
        if (activity != null) {
            activity.startActivityForResult(intent, requestCode, options);
        }
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值