如何在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
相关产品推荐
相关产品推荐

