去年 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 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