一个360 Droidplugin的运用,实现支付插件化,以及插件化实现时遇到的一些问题

针对于360 droidplugin市场运用情况我不是很了解,我写这个相当于只是个人对于360 droidplugin 一个项目运用的总结

一:针对用户
起码自己能集成360 droidplugin ,运行跑通起来,这里我就不多说一些360 droidplugin  的接入,具体的可以看看官方的文档:
点击打开链接

二:场景应用

就是通过把一些简单的第三方支付,做成一个插件,让宿主能够实现支付插件的安装、启动、更新、支付。微信支付没有去研究,估计不行,因为涉及到宿主包名和宿主签名校验问题。

三:工程介绍
由于这个项目之前是用Eclipse开发的。所以我就懒得用Android studio运行了。
总工就四个project

CommonLib:存放一些公共的工具类以及回调类
DroidPlugin_pay:360 Droidplugin的代码
PayHost: 宿主的工程
PayPlugin:支付插件的工程

四:大致思路:
简单来讲就是宿主PayHost,安装好支付插件PayPlugin,启动插件的一个LocalService.这个LocalService只是为了能够让插件运行可以正常的接受广播。 当调用支付的时候,宿主PayHost 发送广播,带上相关参数,当PayPlugin 插件接受到广播后,执行相关操作,部分操作需要在Activity下才能实现,所以就会启动一个透明的Actiivty。比如:调用支付宝支付,等支付完成后,并把透明的activityf 关闭,最后通过广播把结果告知宿主PayHost,实现动态回调。


五:相关问题以及难点:
1.广播发送intent.setPackage 的问题:setPackage的目的是为了限定广播的接收者,只有这个包名的程序才能接收,所以这个埋下了一个坑。因为360droidplugin的插件是虚拟安装的,并不是真正的安装了插件到手机上,简单的表现就是手机上不会显示插件的项目图标。所以intent.setPackage 的时候,如果你设置的是插件的包名程序就无法正常运行。应该设置PayHost的包名。

2.回调的通知问题:实际上宿主和支付插件的回调不是真正的透传实现的。因为Intent 无法实现回调对象的传递,同时360 deroidplugin 好像也无法实现通过startActivityForResult 来实现和插件的同步结果,具体的为什么我也记不清楚了。这里就不深入研究。所以就还是通过广播的方式来实现。

简单的来说就是:宿主发送带参数的有序广播,并且同时注册一个广播接收者,用户来接收插件的结果通知。  插件接收到的宿主的广播后,通过参数的逻辑判断执行操作,然后得出一个结果,并将这个结果也以广播的形式告知宿主。宿主的广播接受者收到后就大致的实现了回调的同步。

3.横竖屏的问题:

我们知道横竖屏切换问题通过设置 android:configChanges 可以解决生命周期重复调用问题,但是这个 android:configChanges设置插件的activity的时候没有生效,具体原因我没有深入了解(估计以我的水平也无法了解)。通过日志来证明:

启动竖屏Activity的时候日志:

启动横屏Activity的日志:

发现调用了两次。对我们的程序会有很大的影响,所以启动payActivity的当前activity必须是竖屏的才能正常运行。否者就会有异常。   正常运行的时候,我们是宿主Host的activity来启动支付插件的,如果Host 发送支付广播的activity是竖屏就正常运行,但是如果是横屏呢,毕竟有很多游戏是横屏的。那也简单,就是发送支付广播之前再启动一个透明的竖屏的activity,然后在这个竖屏透明activity来发送支付广播。

具体的代码就没有写了。这个也简单。

注意:支付插件里面的两个activity 实际上是不需要的MainActivity、MainActivity2  可以删除。只是为了展示下插件化同样可以实现 支付的效果,所以才留下的,同时也是为了打印横竖屏日志所以才留下。


项目工程下载地址:点击打开链接





DroidPlugin360手机助手在 Android 系统上实现了一种新的插件机制:它可以在无需安装、修改的情况下运行APK文件,此机制对改进大型APP的架构,实现多团队协作开发具有一定的好处。定义:HOST程序:插件的宿主。插件:免安装运行的APK限制和缺陷:无法在插件中发送具有自定义资源的Notification,例如: a.  带自定义RemoteLayout的Notification b.  图标通过R.drawable.XXX指定的通知(插件系统会自动将其转为Bitmap)无法在插件中注册一些具有特殊Intent Filter的Service、Activity、BroadcastReceiver、ContentProvider等组件以供Android系统、已经安装的其他APP调用。对Activity的LaunchMode支持不够好,Activity Stack管理存在一定缺陷。Activity的onNewIntent函数可能不会被触发。  (此为BUG,未来会修复)缺乏对Native层的Hook,对某些带native代码的apk支持不好,可能无法运行。比如一部分游戏无法当作插件运行。特点:支持Androd 2.3以上系统插件APK完全不需做任何修改,可以独立安装运行、也可以做插件运行。要以插件模式运行某个APK,你无需重新编译、无需知道其源码。插件的四大组件完全不需要在Host程序中注册,支持Service、Activity、BroadcastReceiver、ContentProvider四大组件插件之间、Host程序与插件之间会互相认为对方已经"安装"在系统上了。API低侵入性:极少的API。HOST程序只是需要一行代码即可集成Droid Plugin超强隔离:插件之间、插件与Host之间完全的代码级别的隔离:不能互相调用对方的代码。通讯只能使用Android系统级别的通讯方法。支持所有系统API资源完全隔离:插件之间、与Host之间实现了资源完全隔离,不会出现资源窜用的情况。实现了进程管理,插件的空进程会被及回收,占用内存低。插件的静态广播会被当作动态处理,如果插件没有运行(即没有插件进程运行),其静态广播也永远不回被触发。使用方法:集成在host中集成Droid Plugin项目非常简单:我们只是需要将Droid Plugin当作一个lib工程应用到主项目中,然后:在AndroidManifest.xml中使用插件的com.morgoo.droidplugin.PluginApplication:<application android:name="com.morgoo.droidplugin.PluginApplication"               android:label="@string/app_name"              android:icon="@drawable/ic_launcher"如果你使用自定义的Application,那么你需要在自定义的Application class onCreate和attachBaseContext方法中添加如下代码:@Override public void onCreate() {     super.onCreate();     //这里必须在super.onCreate方法之后,顺序不能变     PluginHelper.getInstance().applicationOnCreate(getBaseContext()); } @Override protected void attachBaseContext(Context base) {     PluginHelper.getInstance().applicationAttachBaseContext(base); }将插件中Libraries\DroidPlugin\AndroidManifest.xml中所有的provider对应的authorities修改成自己的,默认为com.morgoo.droidplugin_stub_P00,如下:<provider     android:name="com.morgoo.droidplugin.stub.ContentProviderStub$StubP00"     android:authorities="com.morgoo.droidplugin_stub_P00"     android:exported="false"     android:label="@string/stub_name_povider" />可以修改为自己的包名,如: com.e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值