如何在Xamarin共享项目中获取Activity调用NfcFCardEmulation.EnableService
我正在使用Xamarin开发支持HCE功能的应用,项目结构如下:
- hceSample(共享项目)
- hceSample.Android
- hceSample.iOS
我在共享项目hceSample中实现了名为hceService的HCE模拟代码,而非在Android项目中。该服务的enable_Card方法需要调用NfcFCardEmulation.EnableService,此方法要求传入Activity和ComponentName作为参数。目前ComponentName已处理完成,但不知道如何获取Activity,请求指导。
我的hceService中enable_Card方法代码如下:
private Activity activity = null; private bool enable_Card(cardModel card) { try { sid = card.cardSN; tag = "Felica"; emulation.EnableService(, componentName); //<- 如何获取Activity?? emulation.SetNfcid2ForService(componentName, sid); return true; } catch { return false; } }
补充信息:Enable_Card方法的命名空间为hceSample.Service。
我尝试过的方法:
activity = Xamarin.Essentials.Platform.CurrentActivity;<- 找不到此方法!
这是我第一次提问,若有信息缺失或表述不当之处,欢迎指出。
解决方案
1. 通过构造函数传递Activity(推荐)
在共享项目的hceService中添加接收Activity的构造函数,在Android项目的入口Activity(如MainActivity)初始化hceService时传入当前Activity实例:
共享项目hceService修改:
private Activity _activity; // 新增构造函数 public hceService(Activity activity) { _activity = activity; } private bool enable_Card(cardModel card) { try { sid = card.cardSN; tag = "Felica"; emulation.EnableService(_activity, componentName); // 使用传入的Activity emulation.SetNfcid2ForService(componentName, sid); return true; } catch { return false; } }
Android项目MainActivity中初始化:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 初始化hceService时传入当前Activity var hceService = new hceSample.Service.hceService(this); }
2. 通过自定义Application类维护当前Activity
在Android项目中自定义Application类,维护静态属性存储当前Activity,在Activity的生命周期方法中更新:
Android项目自定义Application:
[Application] public class MyApplication : Application { public static Activity CurrentActivity { get; set; } public MyApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) { } }
在Android项目的所有Activity中更新CurrentActivity:
protected override void OnResume() { base.OnResume(); MyApplication.CurrentActivity = this; } protected override void OnPause() { base.OnPause(); MyApplication.CurrentActivity = null; }
共享项目中使用:
private bool enable_Card(cardModel card) { try { sid = card.cardSN; tag = "Felica"; var currentActivity = (Activity)hceSample.Droid.MyApplication.CurrentActivity; emulation.EnableService(currentActivity, componentName); emulation.SetNfcid2ForService(componentName, sid); return true; } catch { return false; } }
3. 修复Xamarin.Essentials的CurrentActivity问题
如果坚持使用Xamarin.Essentials,需要:
- 确保已安装最新版的
Xamarin.EssentialsNuGet包 - 在Android项目的
MainActivity中初始化Essentials:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); // 必须添加此行 } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); }
之后即可在共享项目中调用Xamarin.Essentials.Platform.CurrentActivity获取当前Activity。
内容的提问来源于stack exchange,提问作者user18501010

