通過反射獲取當前應用的Application、Context


package sc.tools;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.app.Application;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
//import android.widget.Toast;


/** 通過反射獲取當前應用的Application、Context */
public class AppliactionTool
{
	private static Application application;
	private static Context context;
	
	/** 反射獲取Application */
	public static Application getApplication()
	{
		if (application != null) { return application; }
		try
		{
			Class localClass1 = Class.forName("com.android.internal.os.RuntimeInit");
			Field localField1 = localClass1.getDeclaredField("mApplicationObject");
			localField1.setAccessible(true);
			Object localObject1 = localField1.get(localClass1);
			
			Class localClass2 = Class.forName("android.app.ActivityThread$ApplicationThread");
			Field localField2 = localClass2.getDeclaredField("this$0");
			localField2.setAccessible(true);
			Object localObject2 = localField2.get(localObject1);
			
			Class localClass3 = Class.forName("android.app.ActivityThread");
			Method localMethod = localClass3.getMethod("getApplication", new Class[0]);
			localMethod.setAccessible(true);
			Application localApplication = (Application) localMethod.invoke(localObject2, new Object[0]);
			if (localApplication != null) application = localApplication;
		}
		catch (Exception localException)
		{
			localException.printStackTrace();
		}
		
		//		Toast.makeText(application, "AppliactionTool -> getApplication()", Toast.LENGTH_SHORT).show();
		return application;
	}
	
	/** 獲取Context */
	public static Context getContext()
	{
		if (context != null) return context;
		return getApplication();
	}
	
	/** 獲取targetSdkVersion */
	public static int getTargetSdkVersion()
	{
		PackageManager localPackageManager = getContext().getPackageManager();
		ApplicationInfo localApplicationInfo;
		try
		{
			localApplicationInfo = localPackageManager.getApplicationInfo(getContext().getPackageName(), 0);
		}
		catch (PackageManager.NameNotFoundException localNameNotFoundException)
		{
			localNameNotFoundException.printStackTrace();
			return 0;
		}
		if (localApplicationInfo != null) { return localApplicationInfo.targetSdkVersion; }
		return 0;
	}
}

 

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