————————————————重要通知——————————————

Hello,本人的博客文章已更新至个人网站(www.jonexu.cn)

文章中有问题可以到网站联系博主,后续新的文章也将更新在个人网站

——————————————————————————————————

 

声明:

我的功能需求:全局悬浮框,也就是在其他应用上依旧能悬浮。查遍uni文档,无法实现,甚至native.js也无法实现,无奈只能走上原生插件开发这条不归路了。(吐槽:天天写前端js,突然写了下android简直要炸,public static String啥的,..var真香,加油吧,争取能入个门!)

本人不懂安卓开发,完全安卓小白,所以安卓方面可能表达的不是很好,安卓代码可能写的不优美,但我功能最终还是实现了。但是为了需求,能力总能被“逼”出来。有描述错误的还望指正。

最后的成果

第一步:安装开发工具

因为是原生开发,所以需要安卓开发工具AndroidStudio。AndroidStudio又需要java环境所以需要安装JAVA JDK搭建Java环境。第三个包是uniapp提供的示例Demo和SDK,是某网盘下载的,建议先下载,毕竟90k/s有点刺激。

附:Android Studio 安装教程          Java jdk安装及环境搭建教程

第二步:开发

安装好开发工具后,先导入下载的Uniapp Demo中解压后有一个叫UniPlugin-Hello-AS安卓项目

  • UniPlugin-Hello-AS工程请在App离线SDK中查找
  • 打开Android Studio菜单选项File--->New--->Import Project。

导入成功之后,等待一会,它会自动下载一些依赖的包,如过程中控制台报错,仔细去看,与下图类似的就提示你缺SDK,问你要不要下载,你点Install,然后选择accept,点击next下载,完了error就没了。

成了之后尝试运行一下Demo,一般的安装教程是让你配置内置模拟器。那家伙卡。太难为人了,直接一根USB怼上去,记得打开USB调试。(也可以使用mumu等安卓模拟器程序调试:android studio连接模拟器调试)

马上Android Studio就能检测到你的手机,嗯~我的渣渣9还是蛮争气的。右边绿色播放按钮,点一下“运行”!成功运行

第三步 插件开发模式

熟悉模式

我们可以先在目录uniplugin_richalert中玩玩以便熟悉该开发模式。

打开文件uniplugin_richalert——src——main——java——uni.dcloud.io.uniplugin_richalert——RichalertWXModule

show这个方法是接收了一个JSONObject和一个jsCallback。我们先注释下title的赋值,改成赋值为“Hello World”,继续运行能发现app点击之后红色标题改了。(如果需要拿option中的数据使用:String myKey = options.getString("key");)

所以说,如果我们要实现一些功能都可以在这里面测试,直接。简单的逻辑就是引入原生插件,调用方法,实现需求。

有些需要初始化操作的需求就需要创建AppHookProxy接口的实体类可以看到同目录的Richalert_AppProxy,在这里就可以写组件的初始化逻辑,但是这个文件需要在项目app——》src——》main——》assets中的dcloud_uniplugins.json文件中对应的组件hooksClass节点添加实现AppHookProxy接口的实体类完整名。

新建一个自己的组件

不能只玩别人现成的,所以来自己写一个文件。

在项目根目录右击new——》Module——》Android Library——》next

创建完成

1)先编辑组件目录下的build.gradle文件。拉到最底,看到dependencies节点,注释全部内容改为如下内容,并且在同级加上如下图一致的repositories节点(这波操作就是因为uni引用原生插件依赖于weex所以需要引入相关依赖包)

 repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compileOnly fileTree(dir: 'libs', include: ['*.jar'])

    compileOnly fileTree(dir: '../app/libs', include: ['uniapp-release.aar'])
    /*注意这个包的路径只适用于UniPlugin-Hello-AS项目中。如果自己要新建项目,
    记得带走这个路径的uniapp-release.aar文件,并且在组件填写正确的路径。*/

    compileOnly "com.android.support:recyclerview-v7:25.3.1"
    compileOnly "com.android.support:support-v4:25.3.1"
    compileOnly "com.android.support:appcompat-v7:25.3.1"
    implementation 'com.alibaba:fastjson:1.1.46.android'
    implementation 'com.facebook.fresco:fresco:0.12.0'
}

2)再到组件目录下src——main——java右击new——Java Class

Name随便取,Superclass填入com.taobao.weex.common.WXModule。其他不动,直接ok完成创建。就可以在这个文件写自己的逻辑了。(新版as没有选Supercalss步骤,直接新建ABC,然后打开文件加上“ public class ABC extends UniModule”)

3)在项目下app——》src——》main——》assets中的dcloud_uniplugins.json文件与其他三个插件一致注册自己新建的组件

4)组件用到的安卓功能权限配置到组件main目录下的AndrioidManifest.xml文件中写<uses-permission xxx />

调试

打开项目里uniapp示例源码,它这是提供了的离线打包的uniapp项目资源,用于联调插件的。别直接去改这代码,无意义,要联调自己的组件得把他源码放到hbuild中修改,然后离线打包再把资源考到安卓项目里才可以生效。往下看。

在hbuilder中打开这个uniapp示例Demo。到page——sample目录下编辑ext-module.nvue文件

然后发行生成本地打包资源(如提示不是该项目的主人,重新获取appid就ok),编译成功会给出App资源路径,将资源替换app——》src——》main——》assets中apps目录下“_UNI_xxx”文件替换成你打包生成的资源,再修改assets/data/dcloud_control.xml!修改其中appid=“你的uniappid”,再到app下的build.gradle文件总注册你的组件。
这样你再去android studio中运行就能看到你UI,也能调用你的组件了。

第四步 打包封装

开发工具最右侧有个“Gradle”点击展开,找到你的组件,build文件夹下双击“assembleRelease”文件(打包方式还可以为工具栏顶部Build——Make Module "xxx"。Build——select variants可以修改生成debug/release),静静等待生成aar文件了,生成后到项目目录你的组件目录build——outputs——aar目录下,会有两个包,我们通常选release的包。

在你的uniapp项目中新建一个nativeplugins文件夹,里面内容如下:

然后配置上图package.json文件:原生开发者支持

主要字段id:你的组件唯一标识,

plugins.class要填你新建的module所属包名并指定到类文件上,plugins.name一定的是id-xxx或id 

integrateType就是“aar”了,

minSdkVersion要与你组件build.gradle中minSdkVersion字段一致。

注意代码中引用组件是这个格式uni.requireNativePlugin(plugins.name)

然后修改manifest.json配置你的原生插件,好了打包自定义基座。就可以开始调试了。ok之后就发布正式包吧

备注

过程中遇到问题

1:新建module后

import com.alibaba.fastjson.JSONObject;

import com.taobao.weex.annotation.JSMethod; 等引入找不到,报红。检查组件build.gradle文件中是否按教程中配置一致并加入了repositories 节点。如果都加了,那就到开发工具顶部菜单File下找到invalidate caches/Restart(清除缓存,重启)

2:组件删除

3:原生安卓中用到的context在weex中写法是“ mWXSDKInstance.getContext()”.

4:在java中判断字符串相等,str=="aaaa"用str.equals("aaaa")替代,不然永远不成立。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐