您的位置:首页 > 其它

11.2 DL动态加载框架、隐藏自己应用图标

2014-11-02 00:43 246 查看
http://blog.csdn.net/singwhatiwanna/article/details/40283117
http://blog.csdn.net/singwhatiwanna/article/details/23387079
使用DexClassLoader加载apk

要加载apk中的资源:

[java] view
plaincopy





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中的资源了,这样我们的问题就解决了。

[java] view
plaincopy





/**

* 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;

}

其次是要实现那两个抽象方法

[java] view
plaincopy





@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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: