.Net MAUI中如何获取Android当前Activity(替代Xamarin.Essentials方案)
官方等效API说明
- 若你迁移的目标是完整.NET MAUI项目,官方直接提供了和
Xamarin.Essentials.Platform.CurrentActivity完全等效的API,无需额外引入Xamarin.Essentials包,直接使用Microsoft.Maui.ApplicationModel.Platform.CurrentActivity即可,调用逻辑和原API完全一致,替换命名空间就能用。 - 若你做的是不引入MAUI工作负载的纯.NET 6 Android单平台项目,不需要复制Xamarin.Essentials源码,可直接基于Android原生提供的生命周期回调实现同等能力,该方案无额外依赖,适配性更强。
纯.NET 6 Android项目无依赖实现方案
该方案和Xamarin.Essentials内部的CurrentActivity实现逻辑完全一致,仅依赖.NET 6 Android项目默认内置的基础库,不会产生依赖冲突:
- 定义全局静态Activity持有类,实现Android原生的
IActivityLifecycleCallbacks接口追踪当前活跃的Activity:
using Android.App; using Android.OS; using Android.Runtime; public static class CurrentActivityProvider { public static Activity? CurrentActivity { get; private set; } public static void Register(Application app) { app.RegisterActivityLifecycleCallbacks(new LifecycleCallback()); } private class LifecycleCallback : Java.Lang.Object, Application.IActivityLifecycleCallbacks { public void OnActivityCreated(Activity activity, Bundle? savedInstanceState) { CurrentActivity = activity; } public void OnActivityResumed(Activity activity) { CurrentActivity = activity; } public void OnActivityDestroyed(Activity activity) { if (CurrentActivity == activity) CurrentActivity = null; } // 其余生命周期方法不需要处理,留空即可 public void OnActivityStarted(Activity activity) {} public void OnActivityPaused(Activity activity) {} public void OnActivityStopped(Activity activity) {} public void OnActivitySaveInstanceState(Activity activity, Bundle outState) {} } }
- 在项目自定义
Application类的OnCreate方法中执行初始化,确保应用启动时就注册生命周期监听:
[Application] public class MainApplication : Application { public MainApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) { } public override void OnCreate() { base.OnCreate(); CurrentActivityProvider.Register(this); } }
完成后全局直接调用CurrentActivityProvider.CurrentActivity就能拿到当前前台Activity,和原Xamarin.Essentials的API使用体验完全一致。
注意:不要在Activity的
OnDestroy触发后仍持有该Activity的引用,上述代码已经在对应生命周期做了置空处理,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Saqib
相关产品推荐
相关产品推荐

