返回博客首页
← 所有文章

Android 应用的启动画面

2015 年 4 月 27 日 — 作者 Georgi Atanasov

应用程序的常见用户体验是在初始化时显示加载(启动)画面。在构建我们的 Telerik Next 会议应用程序时,我们希望显示这样一个画面。虽然 对 iOS 来说很简单,但事实证明,Android 中没有内置机制来实现此功能。

更新: (2016 年 10 月 19 日)

自最初撰写本文以来,已经出现了处理此问题的官方方法。我们提供了关于 使用 Android 创建启动画面 以及 使用 iOS 创建启动画面 的文档。官方 NativeScript 应用程序模板附带启动画面。在 iOS 应用程序中,启动画面是 App Store 审核的必备条件。

 

因此,我询问了网络(感谢 Google!)我们有哪些选择,结果发现最常见的方法是显示一个额外的 Activity 来显示图像,然后继续执行主 Activity。这是一种可行的方案,我的最初尝试是使用它,但我很快意识到它不适合 NativeScript 应用程序的上下文。因为我们会在 UI 线程上初始化 V8 引擎并处理所有 JavaScript 代码(请记住 JavaScript 中重写的主 Activity 的 onCreate 方法),打开一个新的 Activity 不会得到预期的结果。

 

在搜索其他选项没有成功的情况下,我决定仔细研究 Android 中的绘制生命周期和视觉图。引起我注意的是主 Activity 的 WindowsetBackgroundDrawableResource(int resId) 方法。因此,与其打开一个新的 Activity 来显示图像,我决定通过更改 Window 的背景来实现。经过一些反复试验,我最终找到了一个解决方案,你可能会发现它对你的应用程序有用。

 

解决方案

它非常简单 - 创建一个新的 Android 主题,最初应用于主 Activity,然后在 onCreate 方法中,将主题更改为默认主题。这是一个通用的解决方案,它也适用于纯 Android 应用程序。接下来的步骤描述了如何在 NativeScript CLI 项目中实现这种方法(Android 的默认 CLI 项目模板安装了一个位于 `/App_Resources/Android/drawable-nodpi 文件夹中的启动画面图像)。

 

1. 进入 `/App_Resources/Android` 目录,并在其中添加 `values/styles.xml`。

<resources>
 
    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>
 
    <!-- Application theme. -->
    <style name="SplashTheme" parent="AppBaseTheme">
        <!-- Disable window features like ActionBar, Title and Overlay. -->
        <item name="android:windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@drawable/splashscreen</item>
    </style>
 
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>
 
</resources>

 

2. 编辑 `/platforms/android` 目录中的 AndroidManifest.xml 文件,并将以下主题设置为主 Activity。

<activity
    android:name="com.tns.NativeScriptActivity"
    android:label="TestApp"
    android:theme="@style/SplashTheme">

注意: 通常,你不应该修改 platforms 文件夹的内容,因为它会在执行 `platform add ` 命令时被隐式更新。建议的方法是在 `/App_Resources/Android/` 文件夹中添加你扩展版本的 AndroidManifest.xml 文件。由于此功能仍不可用 (我们正在努力解决此问题),为了本博客的需要,我们正在编辑 platforms/android 文件夹中的清单文件。

 

3. 将以下代码添加到应用程序的主文件(例如 app.js)中,以便在不再需要时删除启动画面图像。

var application = require("application");
 
// 检查当前平台(我们只关心 Android)
// 或者,你可以创建 app.android.js 和 app.ios.js
var platform = require("platform");
if(platform.device.os === platform.platformNames.android) {
    application.onLaunch = function(intent) {
        // 在应用程序启动时挂钩 onActivityCreated 回调
        application.android.onActivityCreated = function(activity) {
            // 在 Activity 创建后应用默认主题
            var id = activity.getResources().getIdentifier("AppTheme", "style", activity.getPackageName());
            activity.setTheme(id);
        }
    }
}

 

4. 运行应用程序。你应该在 NativeScript 运行时加载时看到启动画面图像。

Splash_Screen

 

嗯,差不多就是这样 - 祝你使用 NativeScript 和 Android 愉快地创建启动画面!:)