热加载第三方应用的View,实现动态修改宿主应用

背景:

我们要做一个Launcher,Launcher上面要显示apk的界面,但是的话,如果使用widget的方式没法进行复杂的交互,所以要想办法把第三方的apk里的View,动态地加载进来。

怎么实现呢?

Android原生的Launcher其实也是个框架,去遍历孩子,然后显示出来。这里也一样,定好相关的接口,然后各自己的应用需要去实现,再根据条件去遍历/system/app下的应用,然后加载相关的View出来。当对应的View绑定到窗口以后,就去绑定对应的服务,由服务来对这个View进行数据交互。这样子的互动,会比较好一点。

如果说是音乐这些还比较简单,要是地图的控制就比较复杂了。用Widget实现不了。如果能用绘制的View那就么是比较好实现的。

开始啦

这里是Demo,也就是前期的技术预言,所以不需要做一个完整的项目。
要点:能够加载到第三方apk里面的View,并且显示出来,同时可以操作,进行数据交互。
- 有宿主,和第三方APK
- 第三方apk已经安装,所在目录是/system/app/
- 能够进行数据交互,除了简单的点击以外,还可以进行复杂的操作。

还是先看效果吧:

就是实现上效果,可是,这个项目只有一个类,那就是MainActivity.

而且可以进行操作哦,可以点击下一首,上一首,播放!

那是怎么做到的呢?

实现过程

创建一个宿主项目,对应的也是我们以后的Launcer,我们暂且起名为PretendLauncherDemo

我们加载一个界面需要上下文吧,所以就有了:

        //获取TestB的Context        private Context getRemoteContext(String packageName) throws PackageManager.NameNotFoundException {        return createPackageContext(packageName,Context.CONTEXT_IGNORE_SECURITY |   Context.CONTEXT_INCLUDE_CODE);            }

这个方法就是通过包名获取到对应app的上下文对象。

但是要注意的时,通过这个上下文获取到的ApplicationContext是空的呢?也就是说,部分的图片加载工具,比如说ImageLoader,比如说毕加索这些可能拿不到图片,直接崩溃掉,因为context.getApplicationContext拿不到,返回的内容为null。

有了上下文以后,做什么事情都好说,如果只是获取资源文件,这是非常简单的事情:

            /**            * 获取资源对应的编号            *            * @param res            * @param resName            * @param resType layout、drawable、string            * @return            */            private int getId(Resources res, String resType, String resName, String packageName) {            return res.getIdentifier(resName, resType, packageName);            }

有了id,你啥不能拿到呢对吧!
获取View

    /**     * 获取View     *     * @param context     * @param resId     * @return     */    public View getView(Context context, int resId) {        return ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(resId, null);    }

获取颜色值:

     /**     * 获取颜色     *     * @param context     * @param colorId     * @return 颜色值     */    public int getColor(Context context, int colorId) {        return context.getResources().getColor(colorId);    }

其他的获取方式都是一样的。

给大家一个思路:如果遇到问题,就一个一个地去解决即可!哈哈哈!!!!

欢迎关注微信公众号

更多相关文章

  1. Android读取应用列表权限漏洞
  2. 在Android中调用WebService .
  3. java后台程序员转android 《二》之 集成腾讯云 im 及时通讯及采
  4. Android上访问Java做的WebService获取JSON数据的方法及org.xmlpu
  5. Android的GridView和Gallery结合Demo
  6. Android中的动态加载机制
  7. Android基站信息获取以及Sim卡相关信息获取
  8. Android集结号
  9. Android(安卓)反射机制

随机推荐

  1. Android中Activity的四种启动模式详解
  2. Android(安卓)中级教程之------Android(
  3. Android日志输出单元测试Debug
  4. Android(安卓)NDK会带来什么,除去你对NDK
  5. Windows平台下搭建Android原生C/C++开发
  6. Android(安卓)Binder
  7. Android(安卓)JNI remote debugging
  8. Android必备:Android(安卓)Activity的生命
  9. Android(安卓)TextView 中如何使用第三方
  10. android WebView总结