模板工程
一个具有良好开发框架的银行模板项目。它基于Newland SDK实现了各种金融交易。
演示
[demo.apk] 是 BankTemplate,而 [platform.apk] 是一个本地模拟平台。通过这两个apk,可以在开发POS上执行模拟交易。
操作:模拟应用 -> (服务已开启)配置 -> 保存 -> 对话框确认。然后,可以在BankTemplate上执行交易。
注意:模拟平台apk只能在开发POS上执行。
Gradle和环境
Android Studio | Gradle插件版本 | Gradle版本 | Android SDK |
---|---|---|---|
2023.2.1 | 8.0.2 | 8.0 | 33 |
如果打开项目时出现错误,请升级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数据。