安卓类库封装(向导)

本章将为大家讲解如何封装轻语言安卓程序中的组件类库,轻语言安卓程序底层开发语言为 Java ,因此学习本章内容前,读者需掌握一些基本的 Java 编程知识和原生安卓开发知识。

轻语言安卓类库一般分为两种格式:

  • 可视组件

  • 不可视组件

两种组件的工程结构基本一样,区别在与配置文件和具体代码的实现。

视频教程:安卓支持库类库组件封装教程

类库工程结构

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

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

  • libtree.xml

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

libtree.xml

该文件为类库核心配置描述文件,使用XML编写,在IDE中打开一个类库项目时,双击该文件将在 IDE 编辑器中被打开,默认内容如下图所示:

<?xml version="1.0" encoding="utf-8"?>
<package>
    <library
        name = "蓝色按钮" 
        author = "" 
        package = "myapp.component" 
        description = "类库功能描述;蓝色按钮组件" 
        type = "control">

        <control name="蓝色按钮" comment="背景为蓝色、字体为白色的按钮组件">
            <property name="标题" type="文本型" comment="设置或获取当前蓝色按钮的标题。" />
            <method name="标题等于" return="逻辑型" args="(内容 为 文本型)" comment="标题等于。" />
            <method name="置被拖拽回调" return="" args="(回调对象 为 被拖拽回调)" comment="设置被拖拽回调。" />
            <interface name="被拖拽回调" comment="蓝色按钮的被拖拽回调接口。">
                <event name="被拖拽" return="" args="(源对象 为 视图)" comment="当被拖拽时触发并回调该事件。" />
            </interface>
        </control>

    </library>

    <permission xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-permission android:name="android.permission.INTERNET" />
    </permission>

    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
    </manifest>
</package>
  • package :配置文件根节点,不可修改

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

      • name :描述指定类库的名称

      • author :描述类库作者或联系方式

      • package :设置类库当前的包名

      • description :类库的功能描述

      • version :版本(可省略)

      • type :指定类库的类型值;必须;(用于指定类库为可视类库还是不可视类)

        • control 可视组件

        • component 不可视控件

    • library :节点中支持添加的子节点标签类型

      • control 表示该节点为一个可视组件,支持的子节点类型:

        • property 属性
        • constant 常量
        • method 函数
        • interface 事件接口回调
          • event 具体事件
      • component 表示该节点为一个不可视组件,支持的子节点类型:

        • property 属性
        • constant 常量
        • method 函数
        • interface 事件接口回调
          • event 具体事件
      • class 表示该节点为一个纯数据类型,纯数据类型不能被添添加到窗口中,只能在代码中创建使用,纯数据类型不能含有属性、事件等子节点,只支持一个子节点类型:

        • method 函数
    • permission :表示权限节点;在该节点中可添加用于当前类库可能用到的安卓静态权限。

    • manifest :用于配置当前类库在编译时,需要额外添加到(使用该类库的)App项目中的 AndroidManifest.xml 文件里 application 节点中的内容;该节点中允许添加的子节点标签支持原生安卓清单文件中 application 节点的任意内容;例如常见的:

      • <activity>

        • 定义一个原生的Activity窗口,示例:

        • <activity android:name=".MainActivity" />
          
      • <service>

        • 定义一个 Service(后台服务),示例:

        • <service android:name=".MyService" />
          
      • <receiver>

        • 定义一个 Broadcast Receiver(广播接收器),示例:
        • <receiver android:name=".MyBroadcastReceiver" />
          
      • <provider>

        • 定义一个 Content Provider(内容提供者),用于与其他应用共享数据,示例:
        • <provider
              android:name=".MyContentProvider"
              android:authorities="com.example.provider" />
          
      • <meta-data>

        • 元数据节点,为组件或整个应用提供自定义元数据,示例:

        • <meta-data
              android:name="com.google.android.geo.API_KEY"
              android:value="your_api_key_here" />
          
      • 其它更多...

      • 特殊节点 main-activity 主节点子元素、该节点下的内容会被添加到轻语言安卓框架中的主 Activity 中、例如:intent-filter、meta-data、activity-alias 等等;注意:该节点默认配置文档中并未添加、如有需要、需自行添加。

        <main-activity>
            <intent-filter>
            ...
            </<intent-filter>
        </main-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”中的分类文件夹、

注意:类库文件必须放在分类文件夹中,任意分类文件夹中即可。

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

不可视组件

不可视组件、顾名思义在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;
    }
}

事件锚点,快速生成回调事件

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

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

例如:

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

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

其它问题

R资源处理

所有复制到 res 文件夹中的资源文件,默认引用时的包名为配置文档中 package 属性设置的包名,如果类库源代码中使用了第三方开源 Java 代码、第三方代码中用到了R 资源的引用,需修改成配置文档中设置的包名,修改后在编译时系统会自动处理,无需额外操作。

代码示例:

// 源代码中引用R资源时必须为配置文件中的包名
import myapp.component.R;

Jar包的使用

将待封装的 Jar 包文件放到类库项目文件夹中的 static/libs 文件夹内,在代码中即可像正常使用 Java 代码一样使用。

AAR包的使用

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

需特别注意:aar 包中如果引用了其它的 jar 或 aar 文件、也需要一并添加到相应文件夹中,但通常情况下;不建议一个类库中含有多个 aar 文件,因为在合并 AndroidManifest.xml 文件内容时可能会发生冲突或错误,当一个类库项目中含有多个 aar 包时,建议将其拆分。

AndroidX 的使用

将待封装的 androidx-*.jarandroidx-*.aar 包放到 static 文件夹下面对于文件夹中,在代码中正常引用指定类使用即可,但需特别注意:

  1. AndroidX 会出现兼容问题,需自行处理。

  2. AndroidX 包含很多小包、各个小包之间存在互相依赖,封装时需要找到所有用到的包。

  3. 非必要情况下不建议使用 AndroidX 包

可视组件的默认属性及事件

所有的可视组件都必须继承自视图类、而默认的视图类,是所有可视组件的抽象类,视图类中包含了所有可视组件都有的属性、函数、事件,例如每个可视组件都有相同的:

  • 属性

    • 可视

    • 宽度

    • 高度

    • ...

  • 函数

    • 移动

    • 到顶层

    • 取原生对象

    • ...

  • 事件

    • 被单击

    • 被长按

    • 焦点被改变

    • ...

等等。

视图类是所有可视组件的抽象类,每个组件默认都有视图类中的属性、函数、事件,因此在封装组件时、您封装的组件里面不能包含已经存在的属性、函数或事件。

视图类中具体包含了哪些属性、函数、事件,可以在 IDE 中打开一个安卓项目,然后在支持库窗口中按下列路径查看:

核心支持库/基础类/视图

类库线上发布

封装好的类库可以发布到类库市场,销售;类库市场地址:VcnStudio - 类库市场