本发明涉及互联网技术领域,具体涉及一种html脚本启动androidapp指定界面的方法。
背景技术:
随着产品的不断迭代,应用的html5端与app端间良好的交互体验要求也越来越高,在使用过程中经常的会出现从html5端打开app端的登录界面或者注册界面。而android系统规定,界面要让其它html5端访问就必须要配置一套对外可以访问的协议标准。
传统的定义方式就出现了问题:html5端在新迭代的需求中需要打开app端的目标界面,但app端并没有提供这个功能,这个时候就需要对app端进行同步修改,重新打包发布到市场。但这样会影响了新版本的发布进度,而且有时功能需要,还强制用户更新,也影响了用户体验。同时当html5端调用的界面越多,app端就要有更多的界面需要进行配置,虽然此技术不难,但相当繁琐,影响了开发的效率。
有鉴于此,本发明人针对html5端与androidapp端之间交互存在的问题与缺陷,而深入构思且积极研发,进而产生本发明。
技术实现要素:
本发明的目的在于提供一种html脚本启动androidapp指定界面的方法,其可以减少html端打开app端界面时的重复定义协议标准的工作,从而提高工作效率。
为实现上述目的,本发明采用的技术方案是:
一种html脚本启动androidapp指定界面的方法,其包括以下步骤:
步骤1、在androidmanifest.xml清单文件中注册一个对外可被调用的activity界面统一入口,并定义相应的调用协议标准;
步骤2、html5界面根据android规范调用定义的协议,传入将要调用的界面路径来启动这个activity界面;
步骤3、利用动态代理的方式,代理系统出界面管理类的本地binder对象,并拦截界面管理接口的启动方法;
步骤4、在拦截的界面管理接口的启动方法时,判断启动方法中是否包含启动界面,当启动方法中包含启动界面时,将目标界面的intent替换成已注册的activity界面的intent;
步骤5、拦截界面线程类的成员变量mh的线程对象消息传递方法的第一个启动界面对象;并对界面线程类中的线程对象进行动态代理,替换真正要启动的intent。
所述步骤1中,调用协议标准为:scheme://userinfo@host:port/path?query#fragment,其中,scheme是协议名称,userinfo@是用户信息,,host为包名,port为端口号,path是路径,query#fragment为需要传递的参数。
所述步骤3具体如下:
通过java的动态代理,来将系统界面管理类的所有方法拦截下来,然后其修改参数,通过不断的反射,最终获取到本地界面管理类的成员变量的默认变量,该默认变量即为本地binder对象;
获取到本地binder对象之后,通过动态代理构造一个代理对象,将界面管理类接口的所有启动方法都实现出来,那么,系统调用所有界面管理接口的启动方法时,就拦截到所有界面管理接口的启动方法。
采用上述方案后,本发明利用android系统层会提供接口的形式来实现一些回调操作,通过反射去获取持有接口引用的对象,然后将所要启动的界面路径替换原有的对象,这样android系统调用接口的时候,调用替换过的对象,就能达到实现从html脚本启动androidapp指定界面的目的。本发明的方法可以减少html端打开app端界面时的重复定义协议标准的工作,从而提高工作效率。
附图说明
图1为本发明的工作流程示意图。
具体实施方式
如图1所示,本发明揭示了一种html脚本启动androidapp指定界面的方法,具体包括以下步骤:
步骤1、在androidmanifest.xml清单文件中注册一个对外可被调用的activity界面统一入口,并定义相应的调用协议标准。该调用协议标准为:scheme://userinfo@host:port/path?query#fragment,其中,scheme是协议名称,userinfo@是用户信息,可以省略,host可以定义为包名,port为端口号,path是路径,query#fragment即为需要传递的参数。
步骤2、html5界面根据android规范调用定义的协议,传入将要调用的界面路径来启动这个activity界面。
步骤3、利用动态代理的方式,代理系统出界面管理类(android.app.iactivitymanager)的本地binder对象,并拦截界面管理接口的启动方法(startactivity)。
具体地,通过java的动态代理,来将系统界面管理类(android.app.iactivitymanager)的所有方法拦截下来,然后去修改参数,通过不断的反射,最终获取到本地界面管理类(activitymanagernative)的成员变量的默认变量(gdefault),该默认变量(gdefault)实际上是一个activitymanagerproxy界面管理代理对象即本地binder对象,最终的binder跨进程通信在应用上都是通过它当中调用去完成的。
获取到本地binder对象之后,我们就通过动态代理构造一个代理对象,将界面管理类接口(iactivitymanager)的所有启动方法(startactivity)都实现出来,那么,系统调用所有界面管理接口(iactivitymanager)的启动方法(startactivity)时,都可以拦截到。
步骤4、将目标界面(activity)的intent替换成已注册的activity的intent,并将目标界面activity的intent带过去。
在拦截的界面管理接口的启动方法时,判断启动方法中是否包含启动界面,当启动方法中包含启动界面时,把构造的一个intent意图放进去,这个intent意图也带了要启动的目标界面activity,它的componentname组件名称就是在manifest清单文件中中注册的activity界面。
步骤5、拦截界面线程类(activitythread)的成员变量mh的线程对象消息传递方法(handlemessage)的第一个启动界面对象(caselaunch_activity);并对界面线程类(activitythread)中的线程对象(handle)进行动态代理,替换真正要启动的intent。
以上所述,仅是本发明实施例而已,并非对本发明的技术范围作任何限制,故凡是依据本发明的技术实质对以上实施例所作的任何细微修改、等同变化与修饰,均仍属于本发明技术方案的范围内。