gpt4 book ai didi

android - 管理 android Activity 堆栈 : How can a specific instance of an activity bring itself to the front?

转载 作者:行者123 更新时间:2023-11-29 14:41:45 24 4
gpt4 key购买 nike

我有一组要在其中导航的 Activity ,因为初始化这些 Activity 的成本很高,所以我想尽可能保留现有状态。问题是我可能不止一次打开同一个 Activity ,每次都有不同的状态,而且我没有看到标准 Android 标志可以帮助我解决这种情况的方法。

这是一个可视化示例:

假设我有三个 Activity :

A、B、C

这些 Activity 中的每一个都可以打开不止一次,每个 Activity 都处于不同的状态。不仅这些 Activity 的初始化成本很高,而且我还想维护用户的当前状态,例如滚动位置、所选项目等...

假设 A(1) 是状态 1 中 Activity A 的实例,A(2) 是状态 2 中 Activity A 的实例。A(1) 和 B(1) 不相关。

我想实现一个循环导航栈如下:

... --> A(1) --> A(2) --> B(1) --> B(2) --> B(3) --> A(3) --> C(1) --> A(1) --> ...

由于 Activity 很昂贵,我真的很想重用现有的实例。但是,我可能需要保留大约 2 或 3 个相同 Activity 的实例,如您在上面所见。

谢谢!

最佳答案

好的,这实际上是可能的,但您需要使用反射和 Intent.FLAG_ACTIVITY_MULTIPLE_TASK 标志。

这是我的做法:

Controller :使用 Intent.FLAG_ACTIVITY_NEW_TASK 启动 Activity | Intent .FLAG_ACTIVITY_MULTIPLE_TASK

Activities:通过传入一个唯一的 id 来向 Controller 注册自己,以标识它们的状态,并使用 getTaskId() 来标识它们的任务 id

Controller:如果任务已经终止,则创建一个 Activity (它使用 ActivityManager.getRunningTasks() 检查)。如果任务仍然存在,则它使用以下反射代码将任务带到前台:

Class ActivityManagerNative = Class.forName("android.app.ActivityManagerNative");

Method getDefault = ActivityManagerNative.getMethod("getDefault", null);
Object activityManagerNative = getDefault.invoke(ActivityManagerNative, null);

Method[] methods = activityManagerNative.getClass().getMethods();

Method moveTaskToFront;

for (final Method method : methods) { if (method.getName().equals("moveTaskToFront")) { moveTaskToFront = method;}}

...

moveTaskToFront.invoke(activityManagerNative, registeredTaskId);

可以通过从请求任务更改的 Activity 调用 overridePendingTransition 来控制动画。

希望这可以帮助其他人。

关于android - 管理 android Activity 堆栈 : How can a specific instance of an activity bring itself to the front?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7207573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com