Android

个人Android学习总结


全局获取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;&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;&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&amp;lt;?&amp;gt; clazz=Class.forName(&amp;quot;android.app.ActivityThread&amp;quot;); Method method=clazz.getDeclaredMethod(&amp;quot;currentApplication&amp;quot;); Application application= (Application) method.invoke(null); Log.d(&amp;quot;[app]&amp;quot;,&amp;quot;通过反射主线程获取的pplication为:&amp;quot;+application); }</code></pre>

页面列表

ITEM_HTML