我对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
- 我对android插件化开发的理解
- 谈谈我自己对android开发的理解
- 我对Android的理解
- 我对Android的理解
- 我对Android的理解
- 我对敏捷开发的理解
- 我对接口开发的理解
- Android之我对handler的理解
- 我对android中Activity的理解
- 我对Android 加载器的理解
- 我对插件儿实现的理解-献给初学
- 谈谈我对COM、OSGI、插件的理解(一)
- Eclipse插件开发笔记一:对Eclipse的理解
- Android开发:对View DrawingCache的理解
- Android开发:对View DrawingCache的理解
- Android开发对网络缓存的理解
- 我对模板化控件的理解
- 我对各敏捷开发方法的大致理解
- ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍
- ICMP协议Ping方法的Python实现解析
- ReactNative报错:undefined is not an object(evaluating 'RCTCameraRollManager.getPhotos')
- spring 启动完成后事件监听器处理
- Java-单机版的书店管理系统(练习设计模块和思想_系列汇总)
- 我对android插件化开发的理解
- 优化的图片轮播
- iOS调整系统屏幕亮度和音量
- 一致性哈希算法
- Lua的闭包
- cookie和session的实质分析
- iOS开发_iphone 实现剪贴板操作_iphone 复制粘贴功能
- 利用JS获取复选框数据并进行相关操作
- 热敏 压敏电阻