上文开发的插件没有调用原生界面,本文介绍开发带有activity的插件

本文很多操作与上文重复,重复部分会省略

首先打开plug1,先开发插件的原生代码

在以下命名空间创建一个activity

名称为Act1Activity

添加成功后,修改此文件

内容如下:

package com.cesc.ewater.cordovaPlugin;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.TextView;

import com.cesc.ewater.plug1.R;

public class Act1Activity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_act1);

//以下实现获取打开此Activity时传进来的参数值(参数的key是thisText),并显示到一个TextView

TextView txt = (TextView) this.findViewById(R.id.txtInput);

txt.setText(this.getIntent().getStringExtra("thisText"));

}

}

再修改他的layout,文件在此

内容如下:

<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.cesc.ewater.cordovaPlugin.Act1Activity">

<LinearLayout

android:layout_width="368dp"

android:layout_height="495dp"

android:orientation="vertical"

tools:layout_editor_absoluteX="8dp"

tools:layout_editor_absoluteY="8dp">

<TextView

android:id="@+id/textView"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="下面是传入参数例子" />

<TextView

android:id="@+id/txtInput"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

</LinearLayout>

</android.support.constraint.ConstraintLayout>

再创建plugin,类名为Act1Plugin,新建成功如下:

把文件内容修改为:

package com.cesc.ewater.cordovaPlugin;

import android.content.Intent;

import org.apache.cordova.CallbackContext;

import org.apache.cordova.CordovaArgs;

import org.apache.cordova.CordovaPlugin;

import org.json.JSONArray;

import org.json.JSONException;

public class Act1Plugin extends CordovaPlugin {

@Override

public boolean execute(String action, String rawArgs, CallbackContext callbackContext) throws JSONException {

return super.execute(action, rawArgs, callbackContext);

}

@Override

public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {

return super.execute(action, args, callbackContext);

}

@Override

public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException {

if (action.equals("show")) {

//以下用原生代码打开一个Act1Activity(可以理解为让界面跳转到Act1Activity这个界面)

//PS:原生很多地方都要获取当前Activity的实例对象(如果在Activity里就用this),在CordovaPlugin用的是cordova.getActivity()

Intent intent = new Intent(cordova.getActivity(), Act1Activity.class);

//传入参数,参数分别是key和value

intent.putExtra("thisText", "哈哈哈");

cordova.getActivity().startActivity(intent);

return true;

}

return false;

}

}

到此插件编码完成,以上编码的功能意思为,调用插件Act1Plugin时,会跳转到原生安卓界面Act1Activity

回到capp1,开始创建插件

命令行进入capp1目录,执行以下命令创建插件,插件命名为act1-plugin

plugman create --name act1-plugin --plugin_id act1-plugin --plugin_version 1.0.0

在新建的插件文件夹下创建android文件夹

把插件相关的类文件和layout文件都拷到此目录下

PS:不用管原来的文件目录结构,都放在此目录下就行

然后开始编辑plugin.xml ,修改成以下的内容(提供全文内容可以直接复制)

<?xml version='1.0' encoding='utf-8'?>

<plugin id="act1-plugin" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">

<!--插件名-->

<name>act1-plugin</name>

<!--js部分配置-->

<js-module name="Act1Plugin" src="www/act1-plugin.js">

<!--js调用的对象名-->

<clobbers target="Act1Plugin" />

</js-module>

<!--添加安卓平台-->

<platform name="android">

<config-file target="res/xml/config.xml" parent="/*">

<!--js调用的对象名-->

<feature name="Act1Plugin">

<!-- value=java类名全路径-->

<param name="android-package" value="com.cesc.ewater.cordovaPlugin.Act1Plugin"/>

</feature>

</config-file>

<!-- src:java源文件的路径, target-dir:插件安装好后,源文件的位置,要和上面的包名对应 -->

<!--跟插件所有有关的类文件,layout文件等等都要一一配置在下方-->

<source-file src="src/android/Act1Plugin.java" target-dir="src/com/cesc/ewater/cordovaPlugin" />

<source-file src="src/android/Act1Activity.java" target-dir="src/com/cesc/ewater/cordovaPlugin" />

<!--添加layout文件的例子,注意target-dir的值与改文件在as的目录是一样的-->

<source-file src="src/android/activity_act1.xml" target-dir="res/layout" />

</platform>

</plugin>

然后开始编辑此文件

内容如下,可以直接复制进去,

var exec = require('cordova/exec');

//一个exports.XXX代表插件的一个方法,exports后面和exec方法的参数4都是方法名称(此例都是show)

var exec = require('cordova/exec');

//一个exports.XXX代表插件的一个方法,exports后面和exec方法的参数4都是方法名称(此例都是show)

exports.show = function (arg0, success, error) {

//参数1和参数2分别是调用插件成功和失败的回调方法(js)

//参数3是插件名

//参数4是方法名

//参数5是js的传参

exec(success, error, 'Act1Plugin', 'show', [arg0]);

};

打开控制台,进入插件目录,执行npm init

完成后插件目录多了个package.json文件,开始编辑他

添加此部分,下面有文本内容

PS:id是插件名称

"cordova": {

"id": "act1-plugin",

"platforms": [

"android"

]

},

插件修改到此结束,开始把插件添加到cordova应用

控制台进入capp1的安卓平台目录,输入以下命令cordova plugin add E:\project\201712cordovaTest\code\capp1\act1-plugin,命令中的路径是插件的目录

PS:此命令意思是把某个目录的插件添加capp1的cordova应用

成功后capp1会多了如下文件,可以见到插件的文件

到此完成添加插件到cordova应用

接下来开始修改h5应用代码,在h5应用中使用js调用插件

打开vue1

找到主页的js文件

添加代码:Act1Plugin.show();

修改代码完毕,npm build一下

PS:从这段操作开始,在之前的 使用cordova把h5应用打包成apk 已经有说明,也就是h5应用修改后,通过一系列操作把他打包成apk,但在此也重复说明一次

打开www(用webstrom打开,之前有说过),把刚才生成的文件拷过去

PS:注意每次build生成的文件都会有一堆随机数,如果随机数变了就说明该文件内容有修改所以重新生成,反之就没变

然后修改indel.html文件里引用文件的文件名

然后开始cordova打包apk,命令行进入capp1的目录,运行命令cordova build android

然后build一下,会发现很多报错

这是因为capp1只有cordova的基础引用,跟完整的安卓应用的代码还是缺少很多引用

例如Act1Activity会报不能引用android.support.v7.app.AppCompatActivity

PS:以下解决编译错误的方法,估计不具有普遍性,解决以下问题需要一定的原生安卓开发能力

把基类改为Activity

然后import com.cesc.ewater.plug1.R有错

把import com.cesc.ewater.plug1.R删掉,对R使用alt+enter import class

此时build没错了,插上手机,开始调试

PS:其实还有问题的,只是暂时还看不出来

手机开始调试,点击左上角的按钮,但是没有效果,在logcat发现报错

错误大意是找不到Act1Activity,后面还提示是否在AndroidManifest.xml里配置了此Activity

于是去capp1的AndroidManifest.xml,配置Act1Activity

<activity android:name="com.cesc.ewater.cordovaPlugin.Act1Activity" />

然后再次调试,这次app直接崩掉,logcat报错,其中看到Didn't find class "android.support.constraint.ConstraintLayout,意思是找不到ConstraintLayout

回到plug1,可以发现上面的类的引用配置

把这行拷到capp1的相同文件的相同位置

拷完后build一下,发现报错

这原因是plug1的gradle是4.1,而capp1是2.14.1,不同版本的gradle配置文件语法不同,因此这行应该修改成

compile  'com.android.support.constraint:constraint-layout:1.0.2'

解决后再插上手机调试,这次终于成功了

点击左上角按钮

会跳转到下个界面

到此开发完成

开发原生安卓cordova插件(有原生界面)的更多相关文章

  1. 开发原生安卓cordova插件(基础)

    cordova应用如果需要调用原生安卓接口,方法是使用cordova插件,cordova官方提供了主流原生功能的插件,但如果还不能满足需求,也可以自己开发cordova插件 以下介绍开发一个最简单的插 ...

  2. 使用 Android Studio 开发 widget 安卓桌面插件

    •What AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序: 这么说可能有点抽象,看图: 像这种,桌面上的天气.时钟.搜索框等等,都属于 APP Wi ...

  3. 开发自己的cordova插件

    如果还没有配置过cordova环境,首先要下载nodejs,(下载地址https://nodejs.org/)下载完毕安装. 控制台: 1.输入npm -v 确定是否装上了 2.输入sudo npm ...

  4. Cordova - 与iOS原生代码交互2(使用Swift开发Cordova的自定义插件)

    在前一篇文章中我介绍了如何通过 js 与原生代码进行交互(Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)),当时是直接对Cordova生成的iOS工程项目进行编辑操作的(添加 ...

  5. Hybird应用开发实践(一)使用原生/cordova混合项目

    最近准备尝试hybird开发原生应用,因为公司的项目本来就是原生开发的,所以准备选择cordova作为webview嵌入原生项目的开发方式.这里就以mac上整合ios项目为例. 1. 创建cordov ...

  6. Android H5混合开发(2):自定义Cordova插件

    前言 Cordova虽然定义了很多基础的插件,供H5端使用原生设备的功能. 但是,如果业务相关的功能,需要提供给H5端使用,那么,就需要我们自定义插件了. 这个"自定义"不是指由A ...

  7. Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)

    在前面的文章中介绍的了如何使用Cordova进行跨平台应用的开发,使用Cordova的话基本上就不需要在写系统原生代码了,只要通过编写html页面和js方法即可. 但在有些特殊情况下,还是是需要htm ...

  8. cordova插件iOS平台实战开发注意点

    cordova插件是其设计理念的精髓部分,创建并使用自定义插件也是一件比较容易的事.但在这个过程中也容易进入一些误区或者有一些错误的理解,下面从笔者实际开发中遇到的问题出发,对其中的一些注意点和重要概 ...

  9. 混合app开发,h5页面调用ios原生APP的接口

    混合APP开发中,前端开发H5页面,不免会把兼容性拉进来,在做页面的兼容性同事,会与原生app产生一些数据交互: 混合APP开发,安卓的兼容性倒是好说,安卓使用是chrome浏览器核心,已经很好兼容H ...

随机推荐

  1. HDU3338 Kakuro Extension —— 最大流、方格填数类似数独

    题目链接:https://vjudge.net/problem/HDU-3338 Kakuro Extension Time Limit: 2000/1000 MS (Java/Others)     ...

  2. Collections工具类、Map集合、HashMap、Hashtable(十八)

    1.Map集合概述和特点 * A:Map接口概述 * 去重复, * 查看API可以知道, * 将键映射到值的对象, * 一个映射不能包含重复的键, * 每个键最多只能映射到一个值.* B:Map接口和 ...

  3. poj 2771 Guardian of Decency 解题报告

    题目链接:http://poj.org/problem?id=2771 题目意思:有一个保守的老师要带他的学生来一次短途旅行,但是他又害怕有些人会变成情侣关系,于是就想出了一个方法: 1.身高差距   ...

  4. Android中android:visibility的3中属性的剖析

    在Android中控件或者布局的可见性android:visibility有3中情况,他们分别是: View.VISIBLE,View.UNVISIBLE,View.GONE View.VISIBLE ...

  5. [原创]JAVA获取word表格中数据的方案

    上一个项目的开发中需要实现从word中读取表格数据的功能,在JAVA社区搜索了很多资料,终于找到了两个相对最佳的方案,因为也得到了不少网友们的帮助,所以不敢独自享用,在此做一个分享. 两个方案分别是: ...

  6. 无限轮播器的bug修复

    前言:上一回实现了轮播器的自动滚动,但是有两个需要处理的bug. 1.增加需求:当用手拖拽控制轮播器的时候,停止自动滚动. 2.当同一个页面中有tableView,textView或scrollvie ...

  7. BZOJ_5311_贞鱼_决策单调性+带权二分

    BZOJ_5311_贞鱼_决策单调性+带权二分 Description 众所周知,贞鱼是一种高智商水生动物.不过他们到了陆地上智商会减半. 这不?他们遇到了大麻烦! n只贞鱼到陆地上乘车,现在有k辆汽 ...

  8. BZOJ_1812_[Ioi2005]riv_树形DP

    BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...

  9. API介绍

    API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码 ...

  10. Gradle系列之一 Groovy语法精讲

    Gradle技术之一 Groovy语法精讲 gradle脚本是基于groovy语言开发的,想要学好gradle必须先要对groovy有一个基本的认识 1. Groovy特点 groovy是一种DSL语 ...