返回博客首页
← 所有文章

静态绑定生成器 - 它有什么用?

2016年5月20日 — 作者:Plamen Petkov

我们很高兴向您展示 2.0 版本中的一项新功能。一个名为“静态绑定生成器”或简称 **SBG** 的工具。好消息是,它默认启用,您无需执行任何特殊操作即可利用其功能。

我可以将静态绑定生成器用于什么?

Android 开发中一个常见的场景是能够添加自定义 Activity 并导航到它。

还有几个非常流行的库需要此功能。例如,请参阅原生 YouTube SDK。以下是其文档中的一个代码片段

用于显示 YouTube 视频的视图。直接使用此 View 是使用 YouTubePlayerFragment 的替代方法。**如果您选择直接使用此视图,则您的 Activity 需要扩展 YouTubeBaseActivity。**

在原生 Android 应用程序中添加自定义 Activity 或类的 方式是,在 AndroidManifest.xml 文件中声明它,并创建声明的类。这不仅适用于 Activity,也适用于任何 应用程序组件

在 NativeScript 2.0 版本发布之前,您无法在 AndroidManifest.xml 中声明自定义 JavaScript 类。

借助 SBG,现在您可以拥有自定义 Java 类和所有应用程序组件,并在 AndroidManifest.xml 文件中声明它们。这使得 Android 中已有的所有原生功能都可用。为了更清楚地说明,让我们举一个常见的例子

如何向 NativeScript 项目添加自定义 Activity?

步骤 1 - 在 AndroidManifest.xml 文件中声明 Activity
正如我们看到的,Activity 是一个需要在 AndroidManifest.xml 中声明的 Android 类,所以让我们首先做到这一点。

  • 转到 app/App_Resources/Android/AndroidManifest.xml 并添加一个 activity 标签,以便 xml 文件看起来像这样

文件:“app/App_Resources/Android/AndroidManifest.xml”

<manifest …>
    <application … >
        <activity android:name=”com.tns.MyActivity” />
    </application>
</manifest>

 

注意:请注意,我们刚刚声明的“MyActivity”类需要放在至少一个命名空间中,否则它将无法被识别为自定义类。

步骤 2:提供实际的类实现
现在我们已经在清单中声明了自定义 Activity,我们需要提供实际的类实现。

  • 创建包含声明的 Activity 中逻辑的自定义 js 类:app/MyActivity.js

注意:JavaScript 文件可以命名为任何名称,但是必须将其放在“app/”文件夹内的某个位置。为了保持一致性,我将其命名与清单中声明的类相同。

此文件的最小实现如下所示

JavaScript 文件:“app/MyActivity.js”

android.app.Activity.extend("com.tns.MyActivity", {
    onCreate: function (bundle) {
        this.super.onCreate(bundle);
    }
});

 

TypeScript 文件:“app/MyActivity.ts

@JavaProxy("com.tns.MyActivity")
class MyActivity extends android.app.Activity {
    protected onCreate(bundle) {
        super.onCreate(bundle);
    }
};

 

注意:请注意,我们扩展的 Activity 是一个原生 Activity - android.app.Activity。在这里,您可以选择要扩展的原生类。我们还可以继承 android.support.v7.app.AppCompatActivity 并获得相同的结果,这是我们在 2.0 版本之前没有的强大功能。

注意:扩展的名称和在 AndroidManifest.xml 中声明的 Activity 名称需要相同:com.tns.MyActivity

就是这样。您现在可以像在原生 Android 应用程序中一样控制您的 Activity,但只需通过 JavaScript。

演示项目

如前所述,一些利用 SBG 的常见应用程序组件包括 Activity、应用程序和小部件。以下是一些利用 SBG 的常见场景示例

注意:这两个示例都遵循推荐的 Android 方式来启用小部件和 multidex 支持。

性能提升

SBG 带来了一个额外的好处,那就是性能方面。应用程序的初始加载时间有了显著提升。以下是 Nexus 5 上运行的默认 NativeScript 应用程序的数据。

编号 之前 之后 差异
1. 2s694ms 1s901ms  -793
2. 1s610ms 1s579ms  -31
3. 1s622ms 1s547ms  -75
4. 1s657ms 1s603ms  -54

由于 SBG,所有类生成都在构建时完成,使您的应用程序加载速度更快。

幕后发生了什么?

构建后的项目结构

+--app/
|    +--App_Resources/
|    |    +--Android/
|    |    +--AndroidManifest.xml (1)
|    |
|    +--...
|    |
|    |--MyActivity.js  (2)
+--...
+--platforms/
    +--android/
        +--...
        +--src/
            +--main/
                +--assets/
                |   +--app/
                |   +--...
                |
                +--java/ (2)
                    +--com
                        +--tns
                            +--MyActivity.java (3)

 

  1. 您可以编辑 AndroidManifest.xml 文件:添加 Activity、应用程序和其他应用程序组件

  2. 您在 AndroidManifest.xml 中声明的 JavaScript 类

  3. 由 SBG 生成的文件,充当您的 JavaScript 类 MyActivity.js 的代理

  • 在构建时,您创建的 JavaScript 文件将被分析,并且会为“app/MyActivity.js” 创建一个 Java 代理,它也会在您指定的位置生成:com/tns/MyActivity.java

  • 构建将负责编译生成的 Java 文件 com/tns/MyActivity.java (3),并将其打包到应用程序中。

  • 在安装时,您编辑过的 AndroidManifest.xml 将能够使用新生成和编译的 MyActivity.class 文件,并调用其 onCreate 方法,该方法又将调用您的 JavaScript 实现文件 /app/MyActivity.js 及其重写的 onCreate 方法。


借助 SBG,您现在可以拥有自动生成的 JavaScript 代理(以 Java 类的形式),这些代理可以在 AndroidManifest.xml 文件中声明。

现在谁想为 NativeScript 实现一个 YouTube 播放器插件? :)