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);
        }
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章