记录项目中使用的Application

import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.os.Build;
import android.util.Log;

import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicReference;

/**
 * @author wenpengHu
 * @des:本为组件化设计获取application的方式
 * 需要在application中初使化后再使用
 */
public class AppGlobals {
    private static final String TAG = "AppGlobals";

    private static final AtomicReference<Application> sApplication = new AtomicReference<>();

    // 是否允许反射获取 Application
    private static volatile boolean enableReflectionFallback = true;

    // 是否打印 Debug 日志
    private static volatile boolean debugLog = false;

    // 缓存 PackageInfo(减少每次访问 PM)
    private static volatile PackageInfo sPackageInfo;


    // ================================
    //         初始化相关
    // ================================

    /**
     * 推荐在 Application#onCreate() 中调用
     */
    public static void initialize(Application application) {
        if (application == null) throw new IllegalArgumentException("Application cannot be null");

        if (!sApplication.compareAndSet(null, application)) {
            log("Application was already initialized");
        }
    }

    /**
     * 设置 Application(用于插件化/热修复)
     */
    public static void setApplication(Application application) {
        if (application != null) {
            sApplication.set(application);
            log("Application forcefully replaced");
        }
    }

    /**
     * 是否已初始化
     */
    public static boolean isInitialized() {
        return sApplication.get() != null;
    }

    /**
     * 强制检查是否初始化
     */
    public static void ensureInitialized() {
        if (sApplication.get() == null) {
            throw new IllegalStateException("AppGlobals has not been initialized!");
        }
    }

    /**
     * 清除 Application 引用(多用于单元测试)
     */
    public static void clear() {
        sApplication.set(null);
        sPackageInfo = null;
    }


    // ================================
    //         获取 Application
    // ================================

    public static Application getApplication() {
        Application app = sApplication.get();
        if (app != null) return app;

        if (enableReflectionFallback) {
            app = getApplicationByReflection();
            if (app != null && sApplication.compareAndSet(null, app)) {
                return app;
            }
        }

        throw new IllegalStateException("Application instance is not available. " + "You must call AppGlobals.initialize() in your Application class.");
    }

    /**
     * 安全获取 Application(失败返回 null)
     */
    public static Application getApplicationSafely() {
        try {
            return getApplication();
        } catch (Exception e) {
            Log.w(TAG, "Failed to get application instance", e);
            return null;
        }
    }

    /**
     * Context 版本(常用)
     */
    public static Context getContext() {
        return getApplication();
    }

    /**
     * 弱引用(极少数情况下需要)
     */
    public static WeakReference<Application> getApplicationRef() {
        Application app = sApplication.get();
        return app != null ? new WeakReference<>(app) : null;
    }


    // ================================
    //         反射实现
    // ================================

    private static Application getApplicationByReflection() {
        Application app;

        app = getApplicationFromActivityThread();
        if (app != null) return app;

        app = getApplicationFromAppGlobals();
        if (app != null) return app;

        return getApplicationFromContextImpl();
    }

    private static Application getApplicationFromActivityThread() {
        try {
            Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
            Object thread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
            if (thread == null) return null;
            return (Application) activityThreadClass.getMethod("getApplication").invoke(thread);
        } catch (Exception e) {
            log("ActivityThread reflection failed: " + e.getMessage());
            return null;
        }
    }

    private static Application getApplicationFromAppGlobals() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) return null;

        try {
            Class<?> appGlobalsClass = Class.forName("android.app.AppGlobals");
            return (Application) appGlobalsClass.getMethod("getInitialApplication").invoke(null);
        } catch (Exception e) {
            log("AppGlobals reflection failed: " + e.getMessage());
            return null;
        }
    }

    private static Application getApplicationFromContextImpl() {
        try {
            Class<?> contextImplClass = Class.forName("android.app.ContextImpl");
            Object thread = contextImplClass.getMethod("getActivityThread").invoke(null);
            if (thread == null) return null;

            Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
            return (Application) activityThreadClass.getMethod("getApplication").invoke(thread);
        } catch (Exception e) {
            log("ContextImpl reflection failed: " + e.getMessage());
            return null;
        }
    }


    // ================================
    //        包名 / 版本信息
    // ================================

    private static PackageInfo getPackageInfo() {
        if (sPackageInfo == null) {
            synchronized (AppGlobals.class) {
                if (sPackageInfo == null) {
                    try {
                        Application app = getApplicationSafely();
                        if (app != null) {
                            sPackageInfo = app.getPackageManager().getPackageInfo(app.getPackageName(), 0);
                        }
                    } catch (Exception ignored) {
                    }
                }
            }
        }
        return sPackageInfo;
    }

    public static String getPackageName() {
        Application app = getApplicationSafely();
        return (app != null) ? app.getPackageName() : null;
    }

    public static String getVersionName() {
        PackageInfo info = getPackageInfo();
        return (info != null) ? info.versionName : null;
    }

    public static long getVersionCode() {
        PackageInfo info = getPackageInfo();
        if (info == null) return -1;

        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P ? info.getLongVersionCode() : info.versionCode;
    }


    // ================================
    //        进程工具方法
    // ================================

    public static boolean isMainProcess() {
        Application app = getApplicationSafely();
        if (app == null) return false;

        int pid = android.os.Process.myPid();
        ActivityManager am = (ActivityManager) app.getSystemService(Context.ACTIVITY_SERVICE);

        if (am != null) {
            for (ActivityManager.RunningAppProcessInfo info : am.getRunningAppProcesses()) {
                if (info.pid == pid) {
                    return app.getPackageName().equals(info.processName);
                }
            }
        }
        return false;
    }


    // ================================
    //             日志
    // ================================

    private static void log(String msg) {
        if (debugLog) Log.d(TAG, msg);
    }

    public static void setDebugLog(boolean enable) {
        debugLog = enable;
    }

    public static void setEnableReflectionFallback(boolean enable) {
        enableReflectionFallback = enable;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容