我对android插件化开发的理解

来源:互联网 发布:shopex导出淘宝数据包 编辑:程序博客网 时间:2024/04/28 14:44

前不久,在开发中遇到了接口超出的问题,也就是常报的65536的异常。

上网查了处理方法,一种是插件化开发,还有一种则是分包,当时,我还在用eclipse开发所以分包没可能。但时间紧迫,没法,花了一天改用as开发,使用gralde管理顺利成功。

分包的方法就不去具体说了,网上的教程也挺多,步骤也不多。

现在空闲下来,无聊期间,我想起了当初还有个插件化开发的处理方案。小白一个,都不知道插件化开发是什么。后来查了资料发现原来插件化开发是将app分成多个独立的模块,每个模块都是一个单独的app。

今天,说说我对插件化开发的理解。

插件化开发中主app和次app之间的联系是通过shareUserId来关联的,下面是代码

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.zcl.activity"    android:sharedUserId="com.zcl.pluginTest">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@android:style/Theme.Holo.Light.NoActionBar">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>
主app的package必须唯一,因为待会在后面寻找插件中用来做筛选条件用

在主MainActivity中,主要有两部,一个是寻找插件

    /**     * 查找插件     *     * @return     */    private List<PluginBean> findPlugins() {        if(plugins == null) {            plugins = new ArrayList<PluginBean>();            //遍历包名,来获取插件            PackageManager pm = getPackageManager();            List<PackageInfo> pkgs = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);            for (PackageInfo pkg : pkgs) {                //包名                String packageName = pkg.packageName;                String sharedUserId = pkg.sharedUserId;                //sharedUserId是开发时约定好的,这样判断是否为自己人                if (!"com.zcl.pluginTest".equals(sharedUserId) || "com.zcl.activity".equals(packageName))                    continue;                //进程名                String prcessName = pkg.applicationInfo.processName;                //label,也就是appName了                String label = pm.getApplicationLabel(pkg.applicationInfo).toString();                PluginBean plug = new PluginBean();                plug.setLabel(label);                plug.setPackageName(packageName);                plugins.add(plug);            }        }        return plugins;    }
并将需要的插件添加到一个List中去(觉得可以单独领出来做个工具类用)

第二个是在触发特定的操作后加载插件

/**     * 加载插件列表     */    private void attachPlugin() {        for (final PluginBean plugin : plugins) {            Button btn = new Button(this);            btn.setTextColor(Color.RED);            btn.setText(plugin.getLabel());            llMainLayout.addView(btn);            //添加事件            btn.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    boolean isAttack = chbAttachMain.isChecked();                    Intent it = new Intent();                    it.setAction(plugin.getPackageName());                    //是否附加为view                    if (isAttack) {                        //这里偷下懒,这是演示插件作为view附加到主程序中的                        for (PluginBean plugin : plugins) {                            Intent itt = new Intent();                            itt.setAction(plugin.getPackageName());                            ViewGroup view = (ViewGroup) (m_ActivityManager.startActivity("", itt)).getDecorView();                            wkMain.addView(view);                        }                        //一次性附加完毕算了,然后把按钮都删了,看着清净,这几个不是重点                        llMainLayout.removeAllViews();                        chbAttachMain.setVisibility(View.GONE);                        wkMain.setToScreen(0);                    } else {                        //这里,不会把插件的窗体附加到主程序中,纯粹无用的演示                        startActivity(it);                    }                }            });        }    }
主要就是
Intent it = new Intent();it.setAction(plugin.getPackageName());<pre name="code" class="java"> startActivity(it);
这段话,这里有个需要注意的是,这里的action加载的是packageName,所以在插件的配置文件中action的name也应该和包名一样,我想应该可以不一样,等我后期有空在研究研究

插件的配置文件

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    android:sharedUserId="com.zcl.pluginTest"    package="com.zcl.plugin">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@android:style/Theme.Holo.Light.NoActionBar">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="com.zcl.plugin" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>        <activity android:name=".PluginAcitivity1"            android:label="插件的第二个界面"/>    </application></manifest>

这样就可以加载插件了,而且下次如果只修改了插件的代码,直接更新插件就可以了。

新人短见,欢迎大家提出问题一起讨论。
源码下载http://download.csdn.net/detail/u012892687/9497205





0 0
原创粉丝点击