Android双App架构技术问询:主App前台时NFC专用App后台处理NFC交互
Android双应用NFC交互解决方案
可行实现方案
1. 透明Activity栈优化
给CriticalNfcApp的透明Activity做以下配置:
- 在Manifest里设置
android:launchMode="singleInstance"、android:excludeFromRecents="true",并使用全透明主题(如Theme.Translucent.NoTitleBar) - 重写
onPause()方法,调用moveTaskToBack(true)替代finish(),这样当用户切换到MainApp的Activity时,透明Activity只是被移到后台栈,不会被销毁,能持续保持NFC监听 - 在
onCreate()中初始化NFCAdapter.enableReaderMode(this, readerCallback, NFCAdapter.FLAG_READER_NFC_A | NFCAdapter.FLAG_READER_SKIP_NDEF_CHECK, null)
2. AIDL跨进程通信
通过AIDL实现两个应用的双向交互:
- 定义
INfcControl.aidl接口,包含startNfcListening()、stopNfcListening()、registerDataCallback(INfcDataCallback callback)方法 - CriticalNfcApp实现AIDL服务
NfcControlService,在服务中管理透明Activity的生命周期:收到startNfcListening()时启动透明Activity;收到stopNfcListening()时停止监听并销毁Activity - MainApp绑定该服务,调用接口指令控制监听,同时实现
INfcDataCallback接收NFC数据
3. 后台保活补充
Android 8.0+要求前台服务必须有通知,可给CriticalNfcApp添加一个低优先级前台服务:
- 在透明Activity的
onResume()中启动ForegroundService,通知设置PRIORITY_MIN和VISIBILITY_SECRET,这样通知不会在状态栏显示,既满足系统要求,又不干扰用户 - 该服务仅用于防止系统因内存不足杀死CriticalNfcApp进程,核心逻辑仍在透明Activity中
核心思路
- 绕开NFC必须绑定Activity的限制:利用透明Activity的栈管理策略,让它在后台存活而非销毁,维持NFC监听实例
- 安全跨进程交互:通过AIDL+签名校验实现MainApp对CriticalNfcApp的可控调用,确保敏感NFC操作始终在独立隔离的CriticalNfcApp中执行
- 用户体验保障:MainApp始终保持前台,用户可自由导航,无需关闭CriticalNfcApp的界面
架构设计
┌─────────────────────┐ ┌──────────────────────────┐ │ MainApp │ │ CriticalNfcApp │ │ │ │ │ │ MainActivity │◄──AIDL绑定────►│ NfcControlService │ │ (前台展示/导航) │ │ (监听启停控制) │ │ │ │ │ │ INfcDataCallback │◄──数据回调────►│ TransparentNfcActivity │ │ (接收NFC数据) │ │ (NFC监听载体) │ │ │ │ │ │ │ │ NFC敏感处理逻辑 │ │ │ │ (卡交互/数据加密) │ └─────────────────────┘ └──────────────────────────┘
关键细节
- 安全校验:在CriticalNfcApp的AndroidManifest中给
NfcControlService添加自定义权限,要求调用方(MainApp)拥有相同签名,防止非法应用调用敏感功能 - 监听可靠性:在透明Activity的
onResume()中重新启用NFC监听,避免因系统回收导致监听失效 - 导航处理:MainApp导航到其他模块时,可选择调用
stopNfcListening()停止监听,或保持监听(若需持续NFC交互),确保用户操作不受限制
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

