使用 Android Studio 探索 Salesforce 移动 SDK

去年 7 月,我开始撰写系列文章,重点介绍如何在没有传统 Salesforce 客户端的情况下使用 Salesforce 平台。以下是该系列其他文章的链接:

  • 使用 Spring Boot 来利用 Salesforce
  • 使用 Svelte 编写的客户端利用 Salesforce
  • 使用 Vue.js 编写的客户端利用 Salesforce
  • 利用 Salesforce 使用在 React Native 中编写(一次)的移动应用程序
  • 使用 Angular 编写的客户端利用 Salesforce

该系列的图形表示如下所示:

上图显示了各种客户端框架如何在不实际使用 Salesforce 生态系统提供的客户端的情况下访问 Salesforce 数据。

最近,我开始了一个新系列来演示Salesforce 移动 SDK,它在独立的移动应用程序中利用 Salesforce 平台的强大功能。

这个新系列的图形表示如下所示:

“使用 React Native 探索 Salesforce Mobile SDK ”是这个 Mobile SDK 系列的第一篇文章。在本文中,我将重点介绍使用 Android Studio 来生成相同的应用程序。

Salesforce 移动 SDK 的优势

Salesforce 移动 SDK 为软件工程师提供了几个好处:

  • 允许自定义移动设备应用程序利用 Salesforce 特性和功能
  • 完全访问 Salesforce 功能(无需重新发明轮子)
  • 可以使用本机设备的应用程序商店分发应用程序
  • 处理来自 Salesforce 的推送通知
  • 在离线模式下使用 Salesforce 数据的能力

如果您的应用程序环境将 Salesforce 用于业务可操作性的关键方面,则考虑利用 Salesforce 移动 SDK。通过这样做,您可以将 Salesforce 维护的数据集成到关键组件位置,从而做出强有力的业务决策。

使用 Android Studio 的好处

如果您的客户群需要对 Android 设备的支持,并且您希望使用 Android Studio 进行应用程序开发,那么您会在 forcedroid CLI 中找到快速开始使用 Salesforce 功能的价值。

使用 Android Studio 的团队的主要功能包括:

  • 使用 Java 或 Kotlin 作为基础编程语言
  • 为 Android 设备上的特性和功能提供 100% 原生支持
  • 允许有经验的 Android 开发人员快速利用 Salesforce 移动 SDK 功能
  • 特性/功能的长期路线图 – 以及持续支持的质量 – 倾向于 Android Studio 而不是 React Native

现在我们已经准备好深入研究,让我们简要回顾一下我们的用例。

Finny’s Foods:一个示例用例

有一个出生时有特殊需要的儿子(芬尼)带来了个人渴望了解和欣赏我们在日常生活中使用的产品。在芬尼出生前几年,我和妻子(妮可)过着健康的生活方式。然而,当妮可开始深入研究构成我们日常饮食的食物成分时,我们收到了急需的警钟。

快进到今天,我们的饮食包括很少的加工食品、无麸质、低糖和很少的乳制品。我们的蛋白质尽可能来自草食来源,而且我们始终偏爱有机食品。不要让我开始研究转基因生物。

对于这个系列,我们的 Finny’s Foods 应用程序提供了一个简单的膳食列表,这些膳食既能被我们接受,又能被 Finny 喜欢。现在,我们将为每餐包含两个简单的属性:

  • 餐品名称
  • 评分(1 到 5 分,其中 5 分是 Finny 的绝对最爱)

随着时间的推移,我计划引入其他属性(例如摘要、成分、方向,甚至是一张照片),但我们先步行再跑。

Android Studio 入门

除了在我的 MacBook Pro 上安装 git 和 安装之外npm ,我还确保我的 Android Studio 版本是最新的。接下来,我访问了以下 URL,以确保一切都按预期设置和配置:

设置您的 Android 开发环境

这些步骤包括安装 Android Studio、Android SDK 以及至少一个 Android 模拟器 (AVD) 和 forcedroid CLI。

接下来,我 forcedroid 使用以下选项从终端会话执行:

forcedroid create

Enter your application type (native_kotlin or native, leave empty for native_kotlin): native
Enter your application name: finnys-foods-android
Enter your package name: com.gitlab.johnjvester.finnysfoods.android
Enter your organization name (Acme, Inc.): JVC
Enter output directory for your app (leave empty for the current directory):

完成后,我启动了 Android Studio 并导入了新的 finnys-foods-android 项目,如以下 URL 中所述:

https://developer.salesforce.com/docs/atlas.en-us.noversion.mobile_sdk.meta/mobile_sdk/android_new_project.htm

在 Salesforce 中创建膳食对象

在开始在 Android 中创建新应用程序之前,我需要在 Salesforce 中建立 Meal 对象。

我已经有一个可以使用的开发者组织。(你可以在这里创建一个新的 。)所以,我只是使用我的电子邮件地址和该组织的密码登录。接下来,我导航到应用程序 | Salesforce 中的应用程序管理器设置透视图。

我创建了一个名为 Meal 的新 Lightning 应用程序:

在其余设置屏幕上,我选择了所有默认设置并授予对所有 Salesforce 用户配置文件的访问权限。

接下来,我访问了 Objects & Fields | Salesforce 设置中的对象管理器 菜单选项。找到新创建的 Meal 项目后,我使用下拉组件 编辑 对象。

我从 详细信息 子菜单切换到 字段和关系 选项。我很快意识到我不需要为 Meal 对象创建 Name 属性,因为 Salesforce 已经为我处理好了。我只需要添加评级字段。

使用 新建 按钮,我选择了 数字 字段类型并填充了第二步,如下所示:

我使用了默认值并保存了我的新字段。现在,我可以在我的 Android 应用程序中同时使用名称和评分字段。

使用 Salesforce 客户端,我填充了一些源数据以在 Android Studio 中开发应用程序。以下是提交值的摘要:

根据样本数据,Finny 总是更喜欢“Pizza”而不是“Chicken & Rice”。

在 Android Studio 中添加进餐功能

配置好源对象和数据后,我第一次使用我的 IntelliJ IDEA 应用程序打开 ./finnys-foods-android 项目。

为简单起见,我的 Android 应用程序的源代码将存在于该 ./android/MainActivity.java 文件中。构建业务应用程序的功能开发人员应考虑为其 Android 应用程序采用设计原则。CodePath团队的“ Organizing your Source Files ”一文  提供了关于这个主题的一些极好的信息。

该 MainActivity.java 文件已经填充了足够的信息以连接到 Salesforce 并使事情变得非常容易构建。我首先介绍了一个 SOQL 静态字符串来容纳简单的查询来访问 Meal__c object

private static final String SOQL = "SELECT Name, Rating__c FROM Meal__c ORDER BY Name ASC";

我没有按下按钮来查看应用程序中的数据,而是更新了 onResume(RestClient client) 方法来调用该 sendRequest() 方法以从 Salesforce 请求数据:

@Override
public void onResume(RestClient client) {
  this.client = client;

  try {
    sendRequest();
  } catch (UnsupportedEncodingException e) {
    Toast.makeText(MainActivity.this,
	MainActivity.this.getString(R.string.sf__generic_error, 
         e.toString()),	Toast.LENGTH_LONG).show();
  }

  // Show everything
  findViewById(R.id.root).setVisibility(View.VISIBLE);
}

我更新了 sendRequest() 方法,不仅从 Salesforce 检索数据,还为每个项目提供评分的可视化表示:

private void sendRequest() throws UnsupportedEncodingException {
  RestRequest restRequest = RestRequest.getRequestForQuery(
                              ApiVersionStrings.getVersionNumber(this), SOQL);

  client.sendAsync(restRequest, new AsyncRequestCallback() {
    @Override
    public void onSuccess(RestRequest request, final RestResponse result) {
      result.consumeQuietly(); // consume before going back to main thread
      runOnUiThread(() -> {
        try {
          listAdapter.clear();
          JSONArray records = result.asJSONObject().getJSONArray("records");
          for (int i = 0; i < records.length(); i++) {
            listAdapter.add(records.getJSONObject(i).getString("Name") + " "
              + getRating(records.getJSONObject(i).getInt("Rating__c")));
          }
        } catch (Exception e) {
          onError(e);
        }
      });
    }
			
    @Override
    public void onError(final Exception exception) {
      runOnUiThread(() -> Toast.makeText(MainActivity.this,
                           MainActivity.this.getString(
                           R.string.sf__generic_error, exception.toString()),
                           Toast.LENGTH_LONG).show());
    }

    private String getRating(int rating) {
      switch (rating) {
        case 5:
          return "* * * * *";
        case 4:
          return "* * * *";
        case 3:
          return "* * *";
        case 2:
          return "* *";
        default:
          return "*";
      }
    }
  });
}

为简单起见,我决定使用星号符号显示五星级评级项目。所以会出现一个五星级的项目,如下图:

Pizza  * * * * *

我在我的 GitLab 存储库中添加了一个问题,用基于星号的图标(如 Font Awesome 提供的图标)替换星号,这样当评分低于 5 时,将显示空星。

引入自定义文本视图

ListView 我决定创建自己的文本视图,而不是依赖组件的默认设计, 以在包含 Salesforce 中膳食列表的实时视图中显示数据。

在该 ./app/res/layout 文件夹中,我创建了一个新的 XML 文件,名为 custom_text_vew.xml 并包含以下信息:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:fontFamily="sans-serif"
    android:paddingTop="10dip"
    android:paddingBottom="10dip"
    android:paddingLeft="1dip"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="9pt" ></TextView>

我能够设置字体和位置信息以符合我的期望。

有了 XML,我需要做的就是通过以下更新引用自定义文本视图:

listAdapter = new ArrayAdapter<>(this, R.layout.custom_text_view, new ArrayList<>());

一些最后的清理和造型

由于我想匹配我的应用程序的 React Native 版本,我对 ./app/res/layout/header.xml 文件进行了以下更新:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="100dp"
	android:layout_marginTop="5pt"
	android:layout_marginBottom="0pt"
	android:padding="3dp" >

	<TextView
		android:id="@+id/text_title"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_centerVertical="true"
		android:text="@string/app_name"
		android:textSize="12pt"
		android:fontFamily="sans-serif"
		android:textFontWeight="600"
		android:layout_marginLeft="3dp"
		android:paddingBottom="0pt"
		android:paddingLeft="7pt"
	></TextView>

	<View
		android:layout_below="@id/text_title"
		android:layout_width="match_parent"
		android:layout_height="2dp"
		android:layout_marginTop="5pt"
		android:background="@android:color/darker_gray" ></View>

</RelativeLayout>

最后,我查看了该 ./finnysfoods/android/MainActivity.java 文件并删除了所有未使用的方法,因为更新了 header.xml 文件。Android Studio 与 IntelliJ IDEA 一样,擅长更改未使用方法名称的颜色,可以将其删除而不会影响应用程序的运行时功能。

芬尼的食物在行动

使用 Android Studio,我使用了 Run 菜单选项并选择了 Run ‘app’ 选项,该选项也映射到 Shift-F10 快捷方式。

首次使用将自动重定向到 Salesforce 登录屏幕,我使用相同的电子邮件地址和密码访问我的开发人员组织。登录后,出现了 Finny’s Foods 应用程序,其中包括每个项目的五星级评分值。

在几分钟内,我们就能够使用 Android Studio 和 Salesforce Mobile SDK 创建一个 Android 应用程序。

结论

在本文中,我介绍了一个自定义移动应用程序,它从 Android 商店本地部署并使用用 Java 和基本 XML 编写的源代码。在此过程中,我们对基于 Android 的应用程序的结构有了基本的了解。

从 2021 年开始,我一直在努力遵循以下使命宣言,我认为它适用于任何 IT 专业人士:

“将时间集中在提供扩展知识产权价值的特性/功能上。将框架、产品和服务用于其他一切。”

– J.维斯特

Salesforce 移动 SDK 肯定符合我的个人使命宣言,这将使任何需要 Salesforce 功能作为在 Android 设备上运行的自定义移动应用程序的一部分的功能团队受益。这个开发领域的软件工程师当然应该考虑将 Salesforce Mobile SDK 添加为项目依赖项。

如果您希望查看本文的完整源代码,只需导航到 GitLab 上的以下项目:

https://gitlab.com/johnjvester/finnys-foods-android

在本系列的最后一篇文章中,我计划将 Salesforce 移动 SDK 与 xCode 结合使用,为 iOS 设备创建本机应用程序。

有一个非常棒的一天!

using-android-studio-to-explore-the-salesforce-mobile-sdk