【问题标题】:closing an activity using finish(); wont make app start fresh in next run! why?使用 finish() 关闭活动;不会让应用程序在下次运行时重新启动!为什么?
【发布时间】:2015-07-14 17:56:56
【问题描述】:

我想知道是否有人可以对此有所了解,

我有一个具有列表视图的活动应用程序。在 onCreate() 中,我在该列表视图中填充了一些数据(从 sqlite 数据库中读取)。我有一个触发完成()的关闭按钮;也。现在,当我按下关闭按钮时,活动消失了,但是当我单击桌面上的应用程序图标(或从电话历史记录按钮中选择它)时,我会在列表视图中看到所有以前的数据。我正在寻找的功能是在单击关闭按钮以进行下次运行后重新启动应用程序。 (类似于银行应用程序注销按钮)。 (这里的列表视图只是一个满足需求的示例,因此在完成()之前清除列表视图是不可接受的。这是非常简单明了的请求,我认为不需要任何代码,但如果有人感兴趣,我会也贴一些代码。

我想要的是与退出时的银行应用程序相同的行为,当用户离开主屏幕或单击退出时,应用程序会完全关闭。我可以通过使用以下方法(数字 2 和 3)来实现这一点,但显然这些解决方案不是最佳实践。那么银行App用什么方法来瞬间关闭应用呢?我怀疑他们使用的不是最佳实践,例如 System.exit(0)?!还是他们!

  1. 许多开发者声称关闭应用程序或杀死父活动 是操作系统工作

  2. 有人说用用:

    int pid = android.as.Process.myPid();

    android.os.Process.killProcess(pid);

(根据这个解决方案不是一个好主意,因为在下一次运行应用程序的行为就像它上次崩溃了https://stackoverflow.com/a/24015569/4173238

  1. 有人说使用 System.exit(0);根据这个 也不推荐https://stackoverflow.com/a/5846275/4173238

  2. 有人说使用finish();但是完成并没有做我想要的

感谢您的任何意见

【问题讨论】:

  • 如果你在那个按钮上重新排列你的活动堆栈,点击删除所有活动并转到主要活动,然后调用finish()。也许使用 FLAG_ACTIVITY_CLEAR_TOP。
  • “那么银行应用程序使用什么方法通过单击立即终止应用程序?” --首先,请用精确的技术术语解释“终止应用程序”的含义。然后,请用精确的技术术语解释您是如何确定“银行应用程序”会“终止应用程序”的。
  • “应用程序不会回到之前关闭活动的状态”——finish() 就是这样做的。 “finish() 没有为我做同样的工作”——那么你需要详细解释什么是“同样的工作”以及 finish() 没有做什么。您可能还想解释“用户离开主屏幕”的含义。 “我希望你明白,这里的每个人的 android 知识水平都不是一样的”——我希望你明白,你必须提供 a minimal, complete, and verifiable example 什么不适合你。
  • “当我再次点击应用程序图标时,我会在列表视图中看到所有以前的数据”——如果您调用了finish(),那么当您“点击应用程序”时,您正在查看一个新的活动实例再次图标”。这意味着无论“所有以前的数据”来自何处,它都超出了活动的范围,例如在静态数据成员中。您将需要确定这些数据的来源,并在您不想使用时采取措施不使用这些数据。

标签: android android-activity activity-finish


【解决方案1】:

如果您有一个允许you only deliver messages to the main thread when the application is resumed 的机制,那么您可以在Otto 之类的事件总线上注册您的活动,并发送一个每个活动都订阅的事件,他们自己调用finish() .

另一种可能的解决方案是使用startActivityForResult() 开始每个活动,如果您单击exit 按钮,那么您会说

    public static final int KILL_ACTIVITY_RESULT_CODE = 0xD34DB33F; //why not

    public boolean onOptionsMenuItemSelected(MenuItem menuItem) {
          if(menuItem.getId() == R.menu.kill_activity) {
               setResult(KILL_ACTIVITY_RESULT_CODE);
               finish();
          }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode == KILL_ACTIVITY_RESULT_CODE) {
            setResult(KILL_ACTIVITY_RESULT_CODE);
            finish();
        }
    }
}

...有一次我看到有人对他们拥有的每一个活动进行静态引用,并在每个活动上都调用finish()。但是不要那样做,这本质上意味着你作为一个 Android 程序员失败了,没有什么可以赎回你的罪过。

【讨论】:

  • 大声笑你的帖子让我笑了..,我在其他论坛也看到了这个回复。我会试试你的解决方案,明天让你知道。我要去参加 3D 终结者 3 ......干杯
  • 您知道,对活动的静态引用与此代码在同一代码中:reddit.com/r/programminghorror/comments/3c85pp/…
  • 再次感谢您的回复,我不确定我是否关注...我刚刚更新了问题描述,如果您让我知道如何在我的情况下实施您的解决方案,我将不胜感激。跨度>
【解决方案2】:

作为卓越的 CommonsWare,在他的评论中指出“静态”是问题所在!我正在使用静态变量来存储数据以填充我的 listView。显然,即使您只有一个 Activity 并关闭它,静态变量仍然保持不变!在应用程序重新运行! 如果你问我为什么首先使用静态变量,我不得不说,对或错,我想在我的其他 java 类(我的 databaseHandler.class)之间共享该变量。

为什么Android在关闭应用程序的主要和唯一活动时不清除所有(包括静态变量)资源,仍然是一个问题,这是我的下一个阅读主题!但是非常感谢任何对此问题发表评论的人,

我也会把问题改成:

银行应用程序如何关闭? finish() 不为我做同样的工作

使用finish()关闭一个活动;不会让应用程序在接下来重新开始 跑步!为什么?

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多