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 中已有的所有原生功能都可用。为了更清楚地说明,让我们举一个常见的例子
步骤 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 小部件。
注意:这两个示例都遵循推荐的 Android 方式来启用小部件和 multidex 支持。
SBG 带来了一个额外的好处,那就是性能方面。应用程序的初始加载时间有了显著提升。以下是 Nexus 5 上运行的默认 NativeScript 应用程序的数据。
编号 | 之前 | 之后 | 差异 |
1. | 2s694ms | 1s901ms | -793 |
2. | 1s610ms | 1s579ms | -31 |
3. | 1s622ms | 1s547ms | -75 |
4. | 1s657ms | 1s603ms | -54 |
构建后的项目结构
+--app/
| +--App_Resources/
| | +--Android/
| | +--AndroidManifest.xml (1)
| |
| +--...
| |
| |--MyActivity.js (2)
+--...
+--platforms/
+--android/
+--...
+--src/
+--main/
+--assets/
| +--app/
| +--...
|
+--java/ (2)
+--com
+--tns
+--MyActivity.java (3)
您可以编辑 AndroidManifest.xml 文件:添加 Activity、应用程序和其他应用程序组件
您在 AndroidManifest.xml 中声明的 JavaScript 类
由 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 播放器插件? :)