跳到主要内容

模板工程

· 阅读需 4 分钟
Quany
软件工程师

一个具有良好开发框架的银行模板项目。它基于Newland SDK实现了各种金融交易。

演示

[demo.apk]BankTemplate,而 [platform.apk] 是一个本地模拟平台。通过这两个apk,可以在开发POS上执行模拟交易。

操作:模拟应用 -> (服务已开启)配置 -> 保存 -> 对话框确认。然后,可以在BankTemplate上执行交易。

注意:模拟平台apk只能在开发POS上执行。

Gradle和环境

Android StudioGradle插件版本Gradle版本Android SDK
2023.2.18.0.28.033

如果打开项目时出现错误,请升级Gradle到最新版本。(Android Studio->帮助->检查更新

为了方便项目开发,BankTemplate的gradle 进行了一些修改,与原生版本存在以下差异:

  • SDK版本
  • 库依赖
  • 生成的APK名称
  • 签名配置
  • 命名空间(以前是AndroidManifest.xml中的package

具体内容,请参见 **[Gradle配置]

UI

BankTemplate开发了基本的主题、元素颜色和尺寸。

它自定义了常见视图和组件,并使用了多个Lottie动画,适应不同屏幕。

具体内容,请参见 [UI]

逻辑流程

当你在启动器上点击BankTemplate时,应用程序将根据以下流程处理:

[App] 被调用。App将初始化应用程序的基本参数。这个步骤在一个单独的线程上执行,不会影响UI进程。这些参数是应用程序需要初始化的前半部分参数。

//初始化应用程序中的数据
public class App extends BaseApplication {
@Override
public void onCreate() {
...
BaseApplication.SINGLE_EXECUTOR.execute(() -> {
SelfCheckHelper.initAppConfig(this);
});
}
}

然后,[MainActivity] 将被启动。它将在与App相同的单线程上初始化剩余参数。这样可以使参数的初始化按顺序执行。BankTemplate的所有屏幕都在Fragment中实现。

public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
BaseApplication.SINGLE_EXECUTOR.execute(() -> {
SelfCheckHelper.initDevice(this);
...
mSupportDelegate.switchContent(MainFragment.newInstance());
});
...
}
}

所以[MainFragment]将由MainActivity打开以显示主菜单。MainFragment有一个ViewPager来显示[MenuFragment]。MenuFragment包含主菜单。如果一个屏幕无法显示所有菜单项,你可以滑动屏幕到下一个屏幕或进入一个[SubMenuFragment]。

public class MainFragment extends BaseFragment {
...
private void initView() {
...
List<MenuFragment> childFragments = createMenuFragments(items.subList(1, items.size()));
binding.viewPager.setAdapter(new FragmentStateAdapter(this) {
@NonNull
@Override
public Fragment createFragment(int position) {
return childFragments.get(position);
}

@Override
public int getItemCount() {
return childFragments.size();
}
});
...
}
...
@Override
public void onResume() {
super.onResume();
if (MainMenu.getInstance().isChanged()) {
initView();
}
}
}

当点击主菜单项时,[TransActivity]将被打开。然后,TransActivity将开始交易。

public class TransActivity extends BaseActivity {
...
private void transact() {
...
AbstractTrans trans;
try {
Class<? extends AbstractTrans> clz = TransUtils.getTrans(pubBean.getTransType());
if (clz == null) {
LoggerUtils.e("Transaction class is null.");
intent.putExtra(TransTag.MESSAGE, getString(R.string.core_transaction_result_no_such_trans));
intent.putExtra(TransTag.RESULT_CODE, ResultCode.FL);
setResult(RESULT_CANCELED, intent);
finish();
return;
}
LoggerUtils.d("Instantiate transaction: " + clz);
trans = clz.newInstance();
} catch (IllegalAccessException | InstantiationException e) {
...
finish();
return;
}
...
trans.init(this, pubBean);
trans.transact((success) -> {
...
finish();
});
}
...
}

交易

每个交易处理由一个交易类控制。交易类将在TransActivity启动时调用,并在交易类完成后TransActivity结束。

具体内容,请参见 [交易] 。

应用设置

[Settings]是一个用于应用设置的交易。当Settings执行时,它将启动[SettingsActivity]。

SettingsActivity需要密码。有两个密码用于不同的设置。

  • 201003 -> 供应商设置。此密码在代码中是固定的。供应商设置用于紧急处理。
  • 000000-> 管理员/商户设置。此密码可以在设置中修改或通过core/src/main/asset/default_params.ini进行修改。此设置用于商户配置。

Newland SDK

BankTemplate将所有与SDK库相关的API封装在[sdk_helper]模块中。

它包括以下SDK:

ISO8583

[ISO8583.md] 介绍了如何打包8583数据。

Android 子工程

· 阅读需 1 分钟
Quany
软件工程师

整体抽象 tpp

[ ] 1. 网络层 [ ] 2. UI [ ] 3. 注入环境变量,百富还是新大陆

Turbo Modules 对于隐私合规的意义

· 阅读需 1 分钟

Turbo Modules

在之前的架构中 JS 使用的所有 Native Modules(例如蓝牙、地理位置、文件存储等)都必须在应用打开之前进行初始化,这意味着即使用户不需要某些模块,但是它仍然必须在启动时进行初始化。 Turbo Modules 基本上是对这些旧的 Native 模块的增强,现在 JS 将能够持有这些模块的引用,所以 JS 代码可以仅在需要时才加载对应模块,这样可以将显着缩短 RN 应用的启动时间。

目标-事项-分析-执行

· 阅读需 3 分钟
Quany
软件工程师

在制定目标时,明确方向是非常重要的。以下是一些关键步骤来帮助你确立目标和方向。

如何确立目标和方向

  1. 明确目标:确保目标是具体、可衡量、可达成、相关性强和时限性的(SMART 原则)。
  2. 分解目标:将大目标拆分为一系列小目标或里程碑。
  3. 设定时间表:为每个小目标设定明确的时间节点。

事项策略

是否做这件事

  1. ROI(投资回报率):评估成本与预期收益的比例。
  2. 调研了解:充分了解项目背景、市场需求和技术可行性。
  3. 风险评估:识别潜在风险并制定应对措施。

安排事项优先级

  1. SWAT 分析

    • S(紧急):需要立即处理的任务。
    • W(重要):对长期目标有直接影响的任务。
    • A(可延后):可以稍后处理的任务。
    • T(可取消):不紧急也不重要的任务,可以考虑取消。
  2. 四象限法则

    • 紧急且重要:立即处理。
    • 重要但不紧急:计划处理。
    • 紧急但不重要:委托他人处理。
    • 既不紧急也不重要:尽量避免。

常用分析方法

  1. SWOT 分析

    • 优势(Strengths):内部资源的优势。
    • 劣势(Weaknesses):内部资源的不足。
    • 机会(Opportunities):外部环境的机会。
    • 威胁(Threats):外部环境的威胁。
  2. PEST 分析

    • 政治(Political):政策法规的影响。
    • 经济(Economic):市场趋势和经济状况。
    • 社会(Social):社会文化因素。
    • 技术(Technological):技术创新和发展。
  3. 5W1H 分析

    • What:做什么?
    • Why:为什么做?
    • Who:谁来做?
    • Where:在哪里做?
    • When:什么时候做?
    • How:怎么做?

通过以上步骤和方法,可以帮助你更有效地确立目标和方向,并合理安排事项的优先级。

如何制定执行方案

  1. 确定执行方案:确定执行方案,包括任务分配、资源分配、时间安排等。
  2. 制定行动计划:将每个小目标细化为具体的行动步骤。
  3. 监控进度:定期检查进度,确保按计划执行。
  4. 调整计划:根据实际情况调整计划,确保目标能够按时完成。

实施步骤示例

示例 1: 新产品发布

  1. 目标:在接下来的三个月内推出新产品。
  2. 分解目标
    • 设计产品原型
    • 开发产品功能
    • 进行市场测试
    • 正式发布产品
  3. 设定时间表
    • 设计产品原型:第 1 周至第 2 周
    • 开发产品功能:第 3 周至第 6 周
    • 进行市场测试:第 7 周至第 8 周
    • 正式发布产品:第 9 周

示例 2: 提升团队协作效率

  1. 目标:在未来一个月内提升团队协作效率。
  2. 分解目标
    • 优化沟通流程
    • 引入项目管理工具
    • 增加团队培训
  3. 设定时间表
    • 优化沟通流程:第 1 周
    • 引入项目管理工具:第 2 周
    • 增加团队培训:第 3 周

通过以上详细步骤和示例,你可以更好地理解和实施目标管理方法。

MDB 协议

· 阅读需 1 分钟
Quany
软件工程师

MDB 协议

商业化现有工作内容,

内容农场

· 阅读需 3 分钟
Quany
软件工程师

内容农场从来没有这么容易过,我先买一个热搜数据库,然后花费100多元,就能生成10万篇文章,最后加入广告,做好 SEO,网站上线,等着用户点进来就行了

  • 百度热搜
  • 谷歌热搜

协程

协程是一种轻量级线程,它允许在单线程中并发执行多个任务,而不需要创建多个线程。在Android中,协程可以用于实现异步操作,如网络请求、文件读写等。

Android 上如何实现MDB协议

在Android平台上实现Multi-Drop Bus / Internal Communication Protocol (MDB/ICP) 版本4.3,需要考虑以下几个步骤:

  1. 理解协议内容:首先,彻底理解MDB/ICP协议的规范和要求,包括通信格式、命令集、硬件接口等。

  2. 硬件接口:确定Android设备如何与自动售货机的硬件接口。这可能需要使用USB转串口适配器或其他通信接口来连接Android设备与售货机。

  3. 串口通信:Android应用需要实现串口通信功能,以9600波特率与自动售货机的VMC(Vending Machine Controller)进行通信。

  4. 应用开发

    • 使用Android Studio开发应用程序。
    • 在应用中集成串口通信库,如UsbSerialLibrary,来处理与硬件的通信。
    • 根据MDB/ICP协议实现相应的通信逻辑,包括发送命令和解析响应。
  5. 协议实现

    • 编写代码来构建和发送MDB/ICP协议中定义的命令,如RESET、SETUP、POLL等。
    • 实现接收和解析来自VMC的响应数据。
  6. 用户界面:设计一个用户友好的界面,使用户能够发送命令并查看来自自动售货机的响应。

  7. 测试:在实际的自动售货机环境中测试应用程序,确保所有功能都按照协议规范正常工作。

  8. 权限和安全:确保应用程序请求了必要的权限,比如访问USB设备的权限,并处理所有潜在的安全问题。

  9. 优化和调试:根据测试结果对应用程序进行优化和调试,确保稳定和可靠的性能。

  10. 文档和帮助:为应用程序提供详细的文档和用户帮助,解释如何使用应用程序与自动售货机进行交互。

请注意,实现这样的协议可能需要硬件和软件方面的专业知识,以及对自动售货机内部工作原理的深入理解。此外,由于自动售货机可能有不同的硬件和软件配置,因此在开发过程中可能需要与自动售货机制造商紧密合作。

微信公众号