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;
}
}
记录项目中使用的Application
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 使图表宽高与改变宽高之后的容器相适应 注意 ::v-deep 挺重要 .box是存放echarts图表容器...
- 日志的作用主要作用包括: 1、出问题后定位当时问题 2、显示程序当前运行状态 日志的选用Java里存在众多的开源日...
- 在Python项目中使用logging模块进行灵活日志记录的配置 引言:理解Python日志记录的重要性 在软件开...
- 在Python项目中使用logging模块进行灵活日志记录的配置 引言:理解Python日志记录的重要性 在软件开...