安卓组件类库开发

本章将介绍如何封装安卓应用的组件库、在轻舟安卓应用中、一共存在两种类型的组件;分别为:

  • 不可视组件

  • 可视组件

视频教程

接下来我们将分别讲解这两种组件的具体封装方法;这里需要特别注意:封装组件需具有一定的原生安卓开发知识、如果你不具备该条件;请先学习后再尝试封装。

工程目录及文件讲解

两种组件的项目结构是一样的;不同点是在项目配置树文件中的定义所有区别、下方将逐一说明:

  • static (存放静态资源文件夹)

    • assets 存放不进行编译但会被打包到最终类库压缩包的文件
    • libs 存放第三方 jar 包
    • aar 存放第三方 aar 包
    • res 存放drawable、layout、values自定义资源值
  • src 存放类库的源代码、允许多个包名

  • libtree.xml

    • 该文件为类库的核心配置描述文件、在开发时非常重要;整个类库的函数声明、类库信息、包名等都需要在该文件中配置
  • *.vsln 项目索引文件

libtree.xml

在IDE中双击打开该文件后;我们可以看到如下图示:

  • package 根节点(不可更改)

  • library 库节点、所有组件或类都必须添加到该节点中;同时该节点中也用于配置整个类库的具体信息、该节点包含以下属性:

    • name 类库名称
    • author 类库作者
    • package 类库编译时包名
    • description 类库的功能描述
    • version 版本(可省略)
    • type 指定类库的类型值;必须;(用于指定类库为可视类库还是不可视类)
      • component 不可视组件
      • control 可视控件
  • library 支持添加的子节点标签

    • class 普通单一数据类型
      • method 函数
    • control 可视组件
      • property 属性
      • constant 常量
      • method 函数
      • interface 事件接口回调
        • event 具体事件
    • component 不可视组件
      • property 属性
      • constant 常量
      • method 函数
      • interface 事件接口回调
        • event 具体事件
  • permission 权限节点;在该节点中可添加用于当前类库可能用到的安卓权限。

  • manifest 清单文件;在该节点中可添加该类库用到的安卓清单文件元素。

    • application 应用清单主标签

      <application>
          ...
      </application>
    • activity 原生Activity类;必须含有 android:name 属性

    • activity 主节点子元素、该节点下的内容会被添加到轻舟APP框架中的主Activity APP 类中、例如:intent-filter、meta-data、activity-alias 等等;注意:该节点默认配置文档中并未添加、如有需要、自行添加即可:

      <activity>
          ...
      </activity>

注意:一个类库中可以添加无限个组件或数据类型、例如:当你要封装一个阅读APP的类库时、你可以将相关的组件或数据类型都封装到一个类库中;从而方便使用、分享。

可视组件

可视组件、顾名思义表示是可视的、可以看得见的组件;例如在APP中的按钮、标签、文本内容列表框等等;这些组件都属于可视组件;在 IDE 安装包中、位于 “sdk/android/components/primary” 该目录中都是官方已经封装好的组件、大家在封装时可以参考。

所有可视组件必须继承自视图类。

封装组件时首先需要先下载 VcnStudio 开发工具、并解压至非C盘目录;该步骤本教程跳过;打开IDE程序后、点击新建项目、在弹出的窗口中依次选择:移动应用->安卓支持库->可视组件 然后输入项目名称、点击确定;等待数秒、系统将会创建默认的类库项目。

点击确定后、如果无错误、将会打开创建成功的项目;如下图:

默认创建的项目包名为 myapp.component 、位于工程窗口中的 src 节点下面;在我们自定义创建类库时、可以自定义创建自己的包名;删除掉默认包名即可。然后将自己的组件源文件放到你自定义创建的包下面;例如:下方我们创建了一个自己的包名(选中src节点后右键菜单新建背包)、并在这个包中创建一个蓝色背景的标签组件:

默认创建打开后如上图所示为默认代码;此时我们需要修改为可视组件的模板(与默认蓝色按钮一致即可)、然后添加我们自己的代码;完成之后;代码为:

package exp.mytest;

/* 引入安卓开发框架的核心类 */
import com.simple.android.*;
/* 由于项目中没有用到这两个包的内容;需要屏蔽掉、否则编译器会报错 */
//import com.simple.components.*;
//import com.simple.control.*;
/* 引入安卓原生组件相关包 */
import android.view.View;
import android.widget.TextView;
import android.graphics.Color;

public class 蓝色标签 extends 视图
{
    private TextView mTextView;

    @Override
    public View createView()
    {
        mTextView = new TextView(MainActivity.getContext());
        mTextView.setBackgroundColor(Color.BLUE);
        mTextView.setTextColor(Color.WHITE);
        return mTextView;
    }

    public void 标题(String text)
    {
        this.mTextView.setText(text);
    }

    public String 标题()
    {
        return this.mTextView.getText().toString();
    }
}

然后点击编译;如果代码编写无误、将会在IDE底部编译输出窗口输出编译信息;如果编译出现错误;将会输出错误信息、并同时结束编译;如果编译成功;将会提示包含“类库编译成功”的提示内容;并且在项目根目录文件夹中会新增一个“_build”文件夹;在该文件夹中会输出一个未压缩状态的类库目录、和一个后缀为“.scm”的单文件库(方便分享);复制该文件到 “IDE安装目录\sdk\android\components\extends”中的分类文件夹、然后打开IDE即可。

至此、一个简单的可视类库就封装完毕了。

不可视组件

不可视组件、顾名思义在APP中是不可视的;例如时钟、网络操作库等等。不可视组件相对于可视组件、在封装时较简单;首先还是一样、新建项目时选择安卓不可视组件、创建项目后;会默认加载一个空的项目;该项目的默认工程模板与可视组件不完全一样;默认的类为一个普通的数据运算类;因为不可视组件不需要继承任何轻舟框架中规定的父类;其封装方式与原生 Java 编写 Jar 文件一模一样;因此相较可视组件而言、封装不可视组件更为简单、本文以自带的默认工程做示例讲解。

首先当我们打开项目并加载成功后的默认不可视组件代码为:

由于代码相对较简单、这里不做过多解释;但在实际封装时;应该将待封装的类放在自己创建的包中。

配置文档编写

在代码编辑窗口中;当代码编写完毕时、单击右键菜单;选择“生成类文档”菜单项、即可快速生成编辑窗口类的函数、方法文档;这里需要注意自动生成功能只会提取源码中声明为 public 公开的方法、及接口;非公共修饰符的类成员、包含方法接口都不会处理;除此之外只读与只写属性需要自行处理。

如果方法名称相同;且只有一个参数、参数类型和返回值都一样时、会自动识别为可读可写属性;例如:标题;如果方法为只读或只写属性、在方法前输入 /** 属性 */ 标记注释;生成时将会自动处理为属性;例如:

/** 属性;只读属性 */
public String 只读方法名()
{
    return "";
}

/** 属性;只写属性 */
public void 只写方法名(String value)
{

}

MainActivity回调接口

当组件需要监听APP启动、窗口加载完毕、窗口被关闭事件时、可以通过在类库中实现轻舟安卓框架中预先定义的相关回调接口:

  • IOnRequestPermissions :OnRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)

  • IOnActivityResult :OnActivityResult(int requestCode, int resultCode, Intent data)

  • IOnConfigurationChanged :OnConfigurationChanged(Configuration newConfig)

  • IOnNewIntent :OnNewIntent(Intent intent)

  • IOnCreate :OnCreate(Bundle savedInstanceState)

  • IOnDestroy :OnDestroy()

  • IOnKeyDown :OnKeyDown(int keyValue)

  • IOnStart :OnStart()

  • IOnResume :OnResume()

  • IOnPause :OnPause()

  • IOnStop :OnStop()

使用示例:

package mylc.ext;
import com.simple.android.*;
public class 我的组件 extends 视图 implements 
IActivity.IOnCreate,
IActivity.IOnDestroy
{
    Button mButton;
    @Override
    public View createView(){
        this.mButton = new Button(MainActivity.getContext());
        // 注册接口
        IActivity.IOnCreates.add(this);
        IActivity.IOnDestroys.add(this);
        return mButton;
    }
}
  • 回调接口类名:IActivity
  • 添加接口对象:IActivity.{回调接口名}s.add(Object)

事件快捷生成方法

在类库中如果含有回调事件、也就是给组件添加事件;可以在需要添加事件分发的代码处添加下方代码:

//dispatch:回调事件名称(String arg,int arg1)

例如:

@Override
public void onMarkerDrag(Marker arg0)
{
    高德地图标记 flag = new 高德地图标记(arg0);
    //dispatch:标记被拖动(高德地图标记 flag)
}

然后在代码编辑框中右键单击“插入锚点事件”即可自动生成相关联的回调接口代码和事件;需注意:如果存在多个相同名称的事件回调、只能保留一个回调事件。

其它

  • R 资源的处理

    • 类库中的R资源、包含 aar 文件中的资源都会自动处理;无需手动生成。
  • AAR 包的使用

    • 将待封装的 aar 包文件放到 static/aar 文件夹中即可;无需解压;封装时按照使用jar包一样、import 引用待封装的类正常使用即可;aar包中的 R 资源文件也会自动处理。
  • jar 包的使用

    • 将待封装的 Jar 包文件放到 static/libs 文件夹内即可像正常使用 Java 代码一样使用。
  • AndroidX 的使用

    • 将待封装的 androidx 包放到 static/aar 文件夹下面正常引用指定类使用即可。
  • 组件默认属性及事件

    • 可视组件继承自视图类、默认已经自带视图类相关的所有属性、方法、和事件;例如:被单击、被长按事件等等;非特殊必要情况下;无需在类库中重复声明已存在的属性或事件。