当前位置:网站首页>appinventor拓展开发
appinventor拓展开发
2022-04-22 22:04:00 【香道人】
为什么要开发拓展?
想要使用appinventor标准支持的以外功能只有两种方式。
1.直接修改appinventor的源码,添加新的功能,然后使用这个私人定制的服务器。
2.编写拓展,可以添加到任何可以正常使用的appinventor服务上。
第二种的优势很明显,官方支持的拓展形式,让使用者免去了搭建appinventor服务的功夫。
拓展开发环境
如果已经搭建出了标准的appinventor服务,可以直接使用该环境进行开发。
但是如果你还没有搭建appinventor服务,由于该整体的服务搭建过程毕竟慢,且包含多余的服务部分(2G多),所以我们可以使用专门做extension的开发环境:
基础开发步骤
首先下载该库:
git clone --recurse-submodules https://github.com/mit-cml/extension-template.git my-extension
然后在src文件夹内新建MyExtension.java项目:
package cn.temp;
import com.google.appinventor.components.annotations.*;//注解
import com.google.appinventor.components.common.ComponentCategory; //组件类别
import com.google.appinventor.components.runtime.*;
ava的实用工具类库java.util包。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。
import com.google.appinventor.components.runtime.util.*;
import com.google.appinventor.components.runtime.errors.YailRuntimeError;
@DesignerComponent(version = MyExtension.VERSION, //设计器组件
description = "by Aheadtechs.", //备注,描述
category = ComponentCategory.EXTENSION, //类别:展示在appinventor的哪个模块下
nonVisible = true, //不可见
iconName = "images/extension.png") //组件图标
@SimpleObject(external = true) //外部插件
public class MyExtension extends AndroidNonvisibleComponent {
public static final int VERSION = 1; //如果一个数据既是static又是final,那么它会拥有一块无法改变的存储空间
private static final String LOG_TAG = "MyExtension";
public MyExtension(ComponentContainer container) { //记忆技巧:contain 包含,容纳 + er 表物 → 容器
//调用父类的属性或方法可以通过super关键字。通过super来获取父类的私有属性
super(container.$form());
}
//计算a+b的和然后转换成字符串
@SimpleFunction(description = "add up a and b")
public String addab(int a,int b) {
return ""+(a+b);
}
}
然后就可以调用:
ant extensions
编译成功之后就会在项目的根目录生成一个 out文件夹,其中便有我们需要的.aix后缀的文件。
注意拓展的形式就是.aix后缀的文件。
高级开发
这里虽然可以满足我们的基础需求,但是真实开发的过程中不仅仅需要这个的简单例子,我们可能需要第三方库的添加!
例如一个特殊的通信协议:opcua之类的。
具体步骤如下:
1.下载对应的库的jar文件,并拷贝到lib/deps文件夹:

然后在Myextension.java文件中添加:
@SimpleObject(external = true) //外部插件
//这个位置不能放上面!必须在SimpleObject下面
@UsesLibraries(libraries = "opc-ua-stack-1.4.1-224.jar,slf4j-api-1.7.0.jar")
重新进行编译,就可以将该jar的内容添加到生成的.aix文件中,从文件的大小就可以轻松看出。
调用就和普通调用一样了:
import org.opcfoundation.ua.application.Client;
...
参考文档:
版权声明
本文为[香道人]所创,转载请带上原文链接,感谢
https://islet.blog.csdn.net/article/details/124301948
边栏推荐
- 来个 vue 大佬,看看有没有 iframe 缓存方案?
- Pushing hand of industrial Internet innovation iteration
- Best buy website EDI test process
- snap安装repo问题
- Resource packaging dependency tree
- 强化学习(实践):REINFORCE,AC
- 论文笔记: BRITS: Bidirectional Recurrent Imputation for Time Series
- es6将二维、多维数组转化为一维数组
- Secyun assisted the "SaaS cloud management platform solution based on pseudo application integration framework" released by CETC 32
- 51单片机proteus仿真 按键控制数码管数字显示
猜你喜欢

东吴证券X袋鼠云:数据轻松可取、毫秒级反应能力,东吴证券做对了什么?

MySql内置函数

0基础UnityURP渲染管线之阴影ShadowCaster-ShadowMask-Map傻傻分不清楚(代码向)

What is the lifecycle of automated testing?

MySql--数据库基础

一个简单易用的文件上传方案

TCP/IP 协议及网络分层模型

How to use lightly to teach programming classes gracefully?

0-1背包问题讲解 & leetcode相关题目总结

【4.1】flink窗口算子的trigger触发器和Evictor清理器
随机推荐
What is the working nature of Italian ATOS solenoid valve?
Flutter混合开发
【微信小程序开发(云壁纸小程序教程)】
跨域问题及Umi-proxy代理解决跨域问题
2.56-试着用不同的示例值来运行show_bytes的代码。
多层感知机的从零开始实现( 从D2L 包中抽取函数)
删除 vector 内所有指定的元素
中缀转后缀表达式(逆波兰式) 转 前缀表达式(波兰式)
ATOS阿托斯比例阀的工作原理及主要特性概述
Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Rasa全新全局词槽映射的 3 大方法
Node error reporting record: cannot find module are we there yet \ index js
都是做全屋智能的,Aqara和HomeKit到底有什么不同?
01 背包问题
PHP one-dimensional array de duplication
CAS统一身份认证(三):外部独立配置
深开鸿新闻直播间首次开播 共同见证时代成长全历程
Reinforcement learning (practice): dqn, double dqn, dueling dqn
Database resource load management (Part 2)
There's no need for real people to show their faces and shoot videos. Here's the method. Do we media for 20 days 4561
CAS统一身份认证(二):Overlay配置管理
https://github.com/mit-cml/extension-template