全局获取Application对象
<p>全局获取 Application对象</p>
<p>1.任何时候,任何地方,任何逻辑,如何获取全局Application对象
对于这个问题,也许很多人会说,在自定义的application中定义一个方法,然后在onCreate中赋值,这样就可以获取了,没错,绝大部分的人是这样做,而且好像也从来都没有出错过,是的,这种方法是目前大部分的人都会用,然而,这种方法其实是由限制的,当然了在普通的开发中还是没问题的,然而如果不能接触程序逻辑本身的话(在逆向等比较特殊的情况下),那么上面的方法就无效了,那么是不是就没办法了呢,不是的,上面的代码中曾经说过有个方法:</p>
<p>ActivityThraed类提供</p>
<pre><code class="language-java"> //获取ActivityThread对象
public static ActivityThread currentActivityThread() {
return sCurrentActivityThread;
}</code></pre>
<pre><code class="language-java"> //获取当前包名
public static String currentPackageName() {
ActivityThread am = currentActivityThread();
return (am != null &amp;&amp; am.mBoundApplication != null)
? am.mBoundApplication.appInfo.packageName : null;
}</code></pre>
<pre><code class="language-java"> //获取当前进程名
public static String currentProcessName() {
ActivityThread am = currentActivityThread();
return (am != null &amp;&amp; am.mBoundApplication != null)
? am.mBoundApplication.processName : null;
}</code></pre>
<pre><code class="language-java"> //获取当前Application对象
public static Application currentApplication() {
ActivityThread am = currentActivityThread();
return am != null ? am.mInitialApplication : null;
}</code></pre>
<pre><code class="language-java"> //获取LoadApk,LoadApk是一个Apk在内存中的表示,这个跟插件化有关
public final LoadedApk getPackageInfo(String packageName,
CompatibilityInfo compatInfo, int flags) {
return getPackageInfo(packageName, compatInfo, flags,
UserHandle.myUserId());
}</code></pre>
<p>可以看到是可以获取的,可是ActivityThread是一个隐藏类,那怎么办呢,反射吧,下面是代码:</p>
<pre><code class="language-java">private void getGlobalApplication()throws Exception{
Class&lt;?&gt; clazz=Class.forName(&quot;android.app.ActivityThread&quot;);
Method method=clazz.getDeclaredMethod(&quot;currentApplication&quot;);
Application application= (Application) method.invoke(null);
Log.d(&quot;[app]&quot;,&quot;通过反射主线程获取的pplication为:&quot;+application);
}</code></pre>