http://blog.csdn.net/singwhatiwanna/article/details/40283117
http://blog.csdn.net/singwhatiwanna/article/details/23387079
使用DexClassLoader加载apk
要加载apk中的资源:
- protected void loadResources() {
- try {
- AssetManager assetManager = AssetManager.class.newInstance();
- Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
- addAssetPath.invoke(assetManager, mDexPath);
- mAssetManager = assetManager;
- } catch (Exception e) {
- e.printStackTrace();
- }
- Resources superRes = super.getResources();
- mResources = new Resources(mAssetManager, superRes.getDisplayMetrics(),
- superRes.getConfiguration());
- mTheme = mResources.newTheme();
- mTheme.setTo(super.getTheme());
- }
说明:加载的方法是通过反射,通过调用AssetManager中的addAssetPath方法,我们可以将一个apk中的资源加载到Resources中,由于addAssetPath是隐藏api我们无法直接调用,所以只能通过反射,下面是它的声明,通过注释我们可以看出,传递的路径可以是zip文件也可以是一个资源目录,而apk就是一个zip,所以直接将apk的路径传给它,资源就加载到AssetManager中了,然后再通过AssetManager来创建一个新的Resources对象,这个对象就是我们可以使用的apk中的资源了,这样我们的问题就解决了。
- /**
- * Add an additional set of assets to the asset manager. This can be
- * either a directory or ZIP file. Not for use by applications. Returns
- * the cookie of the added asset, or 0 on failure.
- * {@hide}
- */
- public final int addAssetPath(String path) {
- int res = addAssetPathNative(path);
- return res;
- }
其次是要实现那两个抽象方法
- @Override
- public AssetManager getAssets() {
- return mAssetManager == null ? super.getAssets() : mAssetManager;
- }
- @Override
- public Resources getResources() {
- return mResources == null ? super.getResources() : mResources;
- }
http://blog.csdn.net/ydt_lwj/article/details/9419239
显示图片:
<ol class="linenums"><li class="L0"><span class="typ">PackageManager</span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> getPackageManager</span><span class="pun">();</span><span class="pln"></span>
</li><li class="L1"><span class="pln">p</span><span class="pun">.</span><span class="pln">setComponentEnabledSetting</span><span class="pun">(</span><span class="pln">getComponentName</span><span class="pun">(),</span><span class="pln"> </span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">COMPONENT_ENABLED_STATE_ENABLED</span><span class="pun">,</span><span class="pln"> </span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">DONT_KILL_APP</span><span class="pun">);</span></li></ol>
隐藏图标:
<ol class="linenums"><li class="L0"><span class="typ">PackageManager</span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> getPackageManager</span><span class="pun">();</span><span class="pln"></span>
</li><li class="L1"><span class="pln">p</span><span class="pun">.</span><span class="pln">setComponentEnabledSetting</span><span class="pun">(</span><span class="pln">getComponentName</span><span class="pun">(),</span><span class="pln"> </span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">COMPONENT_ENABLED_STATE_DISABLED</span><span class="pun">,</span><span class="pln"> </span><span class="typ">PackageManager</span><span class="pun">.</span><span class="pln">DONT_KILL_APP</span><span class="pun">);</span></li></ol>