gpt4 book ai didi

android - 如何完成销毁的 Activity

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:38 25 4
gpt4 key购买 nike

据我了解,销毁 的 Activity 并不等同于完成的 Activity。

  • 完成
    • Activity 已从 back stack 中删除。
    • 它可以由程序触发(例如通过调用 finish() ),或由用户按下后退键(隐式调用 finish() )触发。
    • 完成一项 Activity 会销毁它。
  • 销毁
    • Android 操作系统可能会破坏不可见的 Activity 以恢复内存。当用户导航回到该 Activity 时,将重新创建该 Activity 。
    • Activity 在用户旋转屏幕时被销毁并重新创建。
    • 引用:Recreating an Activity

那么我如何完成已销毁的 Activity finish() 方法需要一个 Activity 对象,但如果 Activity 被销毁,我没有 Activity 对象 - 我不应该持有对已销毁 Activity 的引用,对吗?


案例研究:

我有一个 Activity a,它启动 b,它又启动 c(使用 Activity.startActivity() ),所以现在 back stack 是:

a → b → c

c 中,用户填写表单并点击提交按钮。使用 AsyncTask 向远程服务器发出网络请求。任务完成后,我显示 toast 并通过调用 c.finish() 完成 Activity 。完美。

现在考虑这个场景:

当异步任务正在进行时,用户切换到另一个应用程序。然后,由于内存限制,Android 操作系统决定销毁所有 3 个 Activity(abc)。稍后,异步任务完成。现在如何完成 c

我尝试过的:

  • 调用 c.finish() :
    • 不能,因为 c 被破坏了。
  • 调用 b.finishActivity() :
    • 不能,因为 b 被破坏了。
  • 使用 Context.startActivity()FLAG_ACTIVITY_CLEAR_TOPb 提升到顶部,从而完成 c:

    // appContext is an application context, not an activity context (which I don't have)
    Intent intent = new Intent(appContext, B.class); // B is b's class.
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    appContext.startActivity(intent);
    • 失败,appContext.startActivity() 抛出异常:

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

编辑: 澄清:我需要等到异步任务完成后再决定是否完成 c基于服务器的响应。

最佳答案

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

  • 当您从
    开始 Activity 时,通常会发生此异常后台线程或服务。你需要通过
    FLAG_ACTIVITY_NEW_TASK每当你需要“启动器”时标记
    行为类型。

    • 只需添加 mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 即可避免此异常。

  • 不建议您尝试终止 Activity 的方式,让安卓自己处理。完成一项 Activity 没有任何意义已经被摧毁了。

现在,您可以做什么?

  • 如果当应用程序不在前台时您在完成 Activity 时遇到问题,您可以做的是实现安全检查,只有当应用程序在前台时才能完成 Activity 以转到后台 Activity 或否则就跳过这一步。

  • 我认为您正试图在应用程序处于后台时终止 Activity 。这样做似乎有点困难,但你可以利用 onUserLeaveHint决定应用程序何时进入后台以完成 Activity ,或者您可以通过在 onStop() 中添加 finish(); 来完成 Activity 。只需确保 asynctask 的 onPost() 不会再次完成它以避免异常。

  • 看看android:clearTaskOnLaunch属性并将其设置为 true。

    Google Doc 说这个属性是:

    for example, that someone launches activity P from the home screen, and from there goes to activity Q. The user next presses Home, and then returns to activity P. Normally, the user would see activity Q, since that is what they were last doing in P's task. However, if P set this flag to "true", all of the activities on top of it (Q in this case) were removed when the user pressed Home and the task went to the background. So the user sees only P when returning to the task.

    我认为这正是您想要的。

希望这会给您一些提示,以完成您想要的任务。

关于android - 如何完成销毁的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14680953/

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