跳到主要内容

219 篇博文 含有标签「iCoding」

个人简介

查看所有标签

模板工程

· 阅读需 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. 注入环境变量,百富还是新大陆

目标-事项-分析-执行

· 阅读需 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. 文档和帮助:为应用程序提供详细的文档和用户帮助,解释如何使用应用程序与自动售货机进行交互。

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

微信公众号

Compose UI

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

Compose UI是 Android Jetpack 的一部分,它提供了一种声明式的方式来构建用户界面。Compose UI 使用 Kotlin 语言,并支持使用 Kotlin 函数和数据类来描述界面。

Compose UI 是一种声明式的 UI 框架,它使用 Kotlin 语言和 Kotlin 函数来描述界面。Compose UI 提供了多种组件,如 Text、Button、Image 等,这些组件可以组合成一个复杂的界面。

Compose UI 的核心概念是“Composable”函数,这些函数可以组合成一个复杂的界面。Composable 函数使用 Kotlin 函数和数据类来描述界面,并使用 Kotlin 语言的语法和特性来实现界面的逻辑和交互。

Compose UI 的优点包括:

  1. 声明式:Compose UI 使用 Kotlin 语言和 Kotlin 函数来描述界面,使得界面的描述和实现分离,使得界面的描述更加清晰和易读。
  2. 跨平台:Compose UI 支持跨平台开发,可以同时开发 Android、iOS、macOS、Windows 等平台。
  3. 兼容性:Compose UI 支持使用 Kotlin 语言和 Kotlin 函数来描述界面,使得界面的描述和实现分离,使得界面的描述更加清晰和易读。
  4. 性能:Compose UI 使用 Kotlin 语言和 Kotlin 函数来描述界面,使得界面的描述和实现分离,使得界面的描述更加清晰和易读。

Compose UI 的缺点包括:

  1. 学习曲线:Compose UI 的学习曲线较高,需要掌握 Kotlin 语言和 Kotlin 函数。
  2. 性能问题:Compose UI 的性能问题需要通过优化来避免。

Compose 中的基本布局