You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xamarin.Android中列出所有已打开的Activity?

Xamarin.Android 获取已打开Activity列表实现方案

Android 没有对外公开获取栈内所有Activity的系统API,因此我们通过全局监听Activity生命周期、手动维护栈列表的方式实现需求,实现逻辑如下:


1. 新建全局Application类管理Activity栈

这个类负责全局存储已打开的Activity列表,同时注册生命周期回调自动更新列表:

[Application]
public class BaseApplication : Application
{
    // 按启动顺序存储已打开的Activity类型
    public List<Type> OpenedActivityTypes { get; } = new List<Type>();

    public BaseApplication(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    public override void OnCreate()
    {
        base.OnCreate();
        // 注册全局Activity生命周期监听
        RegisterActivityLifecycleCallbacks(new ActivityLifecycleListener(this));
    }
}

2. 实现生命周期监听类

通过Activity的创建、销毁回调自动维护列表的增删:

public class ActivityLifecycleListener : Java.Lang.Object, IActivityLifecycleCallbacks
{
    private readonly BaseApplication _app;

    public ActivityLifecycleListener(BaseApplication app)
    {
        _app = app;
    }

    public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
    {
        // 新Activity创建时加入列表,如需支持同个Activity多开则去掉判重逻辑
        var activityType = activity.GetType();
        if (!_app.OpenedActivityTypes.Contains(activityType))
        {
            _app.OpenedActivityTypes.Add(activityType);
        }
    }

    public void OnActivityDestroyed(Activity activity)
    {
        // Activity销毁时从列表移除
        var activityType = activity.GetType();
        if (_app.OpenedActivityTypes.Contains(activityType))
        {
            _app.OpenedActivityTypes.Remove(activityType);
        }
    }

    // 其余生命周期无需处理,保留空实现即可
    public void OnActivityStarted(Activity activity) { }
    public void OnActivityResumed(Activity activity) { }
    public void OnActivityPaused(Activity activity) { }
    public void OnActivityStopped(Activity activity) { }
    public void OnActivitySaveInstanceState(Activity activity, Bundle outState) { }
}

3. 任意位置调用获取列表

在需要获取列表的Activity中直接调用全局实例的属性即可:

// 拿到全局Application实例
var app = (BaseApplication)Application.Context;
// 按启动顺序获取Activity名称列表
List<string> activityNames = app.OpenedActivityTypes.Select(type => type.Name).ToList();
  • 仅打开MainActivity时,返回结果为 ["MainActivity"]
  • 依次打开MainActivity→SecondActivity→ThirdActivity时,返回结果为 ["MainActivity", "SecondActivity", "ThirdActivity"]

注意事项

如果你的业务允许同个Activity重复打开多个实例,只需要删掉OnActivityCreated中的包含判断逻辑,每次创建都新增元素,销毁时移除第一个匹配的元素即可。

内容的提问来源于stack exchange,提问作者Alessandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:57:04