我有一个Android应用,其中包含注册到Android光束的服务以及注册到主机卡模拟的服务。我想决定何时在代码中启用/禁用HCE服务。 清单中的HCE服务看起来像这样 -
<service
android:name="com.bimo.verifonewallet.service.MyHostApduService"
android:exported="true"
android:permission="android.permission.BIND_NFC_SERVICE" >
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
</intent-filter>
<meta-data
android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/apduservice" />
</service>
实际上,当智能手机收到选择AID命令(使用服务AID)时,将触发服务并执行服务onCreate()的功能,并在事务完成后调用onDestroy()函数
因此,当我从主活动中执行startService()和stopService()时,它无效。
我可以控制是否调用服务吗?
答案 0 :(得分:2)
您可以尝试 1 来禁用整个服务组件(请参阅此question/answer)并仅在您的活动位于前台时启用该服务:
public void onResume() {
super.onResume();
PackageManager pm = getPackageManager();
pm.setComponentEnabledSetting(new ComponentName(this, "com.example.app.HceService"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
public void onPause() {
super.onPause();
PackageManager pm = getPackageManager();
pm.setComponentEnabledSetting(new ComponentName(this, "com.example.app.HceService"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
但是,我强烈建议您的HCE服务仍然响应某些命令(特别是应用程序选择),并且您只会阻止安全/隐私相关命令。例如,您可以通过在应用程序的共享首选项中设置一个标记(请参阅this question,了解为什么共享首选项将是首选方法)来指示是否允许服务执行某些操作或不。然后,您可以在HCE服务中查询该标志,并确定HCE上应该提供哪些功能。
还要记住,完全禁用您的HCE服务(使用上述方法)可能允许其他应用程序(恶意或非恶意)接管您的AID通信。
1 )我没有在创建和更新HCE服务列表时检查Android源。因此,可能会出现HCE服务列表(NFC系统服务已知)可能不会在每次setComponentEnabledSetting()
呼叫时更新。