【问题标题】:Start fresh with running OnCreate of the MainActivity从运行 MainActivity 的 OnCreate 重新开始
【发布时间】:2014-08-17 16:52:30
【问题描述】:

我阅读了很多关于这个主题的帖子,但我找不到任何适合我需要的东西。

我有一个包含 3 个活动的应用程序(在这里我将它们称为屏幕,更直观):A (MainActivity)、B 和 C。
屏幕 A 启动另一个进程,从该进程中检索一些信息并根据答案设置布局。然后它让你有机会做某事(写一篇文章)。这是在 OnCreate() 上完成的。

屏幕 B 不是很有趣(显示文本并允许您对其进行编辑)。

屏幕 C 有一个退出应用程序的按钮(基本上是启动 home 活动)。 C 还关闭了我们在 A 上启动的进程(在向它传达了一些信息之后)。

到目前为止一切顺利。 问题是当我重新启动我的应用程序时,我再次看到屏幕 C。这对我不好,因为我希望用户能够编辑文本,而不必返回第一个或第二个屏幕(不是因为它很难,而是因为我需要他看到呈现在在他做任何事情之前屏幕 A。而这不能在 C 之后完成,因为在 C 完成之后,除非他决定再次启动应用程序)。
这意味着当我到达屏幕 C 并按下按钮时,我的应用程序已完成,我在那里无事可做(但要重新开始)。但是,如果我的应用在屏幕 B 上暂停,则无需重新开始 - 我可以回到它并从那里继续(常规的 Android 行为)。

所以我设置了android:clearTaskOnLaunch="true"但现在我有两个问题:
1. 即使应用程序在 B 上暂停,它现在又重新开始(有点,见 #2),这不是我需要的。
2. 它并没有真正重新开始......是的,我看到了屏幕 A。但是我在 OnCreate() 上所做的所有事情都没有再次完成,这意味着我的其他进程没有启动并运行,然后我的应用程序崩溃了,因为我没有人可以说话.....

这种情况有什么解决办法吗? 只有在应用程序的上一次运行完成之后(我们按下屏幕 C 上的单个按钮并返回主屏幕),我才需要重新开始(但真的很新鲜,我在 OnCreate() 上所做的所有事情都会再次完成)。 在任何其他暂停情况下(如果我们还没有按下按钮,在 A、B 甚至 C 中)我想要正常的 Android 行为(即返回到同一屏幕)。

任何帮助将不胜感激。

【问题讨论】:

    标签: android oncreate main-activity


    【解决方案1】:

    要解决这个问题,您可以利用 Android Activity 生命周期:http://developer.android.com/training/basics/activity-lifecycle/stopping.html

    只需在 Activity B 中调用 finish() 并在 onStop() 或 onPause() 中适当地调用 C 以在应用程序关闭时擦除这些 Activity(或您所说的“屏幕”)。当您重新打开应用时,Activity A 应重新打开并保持上一个状态。

    如果您也希望清除 Activity A 中的最后一个状态,则在适当的地方添加一个 finish() 调用(可能根据您的用例再次 onStop 或 onPause)

    祝你好运!

    【讨论】:

    • 对,屏幕 = 活动 :) 你说“当你打开你的应用程序时,活动 A 应该重新打开并保持最后一个状态”是什么意思?我不需要最后一个状态,我需要重新开始,以防我完成了我的应用程序(即我按下了活动 C 上的按钮)
    • 哦,明白了,我没有仔细阅读。在这种情况下,只需在活动 A 中适当地调用 onStop 或 onPause 中的 finish() 即可。我会把这个添加到我的答案中..
    【解决方案2】:

    我之前有一个类似的应用程序,一个调查应用程序,并且遇到了同样的情况。 A->B->C,一旦你完成了C,你就直接去A,不能回去,但你可以从B->A回去。这是我所做的:

    1) 在启动 B Activity 时将其添加到 A Activity:

            Intent start;
        start = new Intent(MainActivity.this, RecordName.class);
        startActivityForResult(start, 2);
    

    你的 A 活动中的这个方法:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          if (requestCode == 2) {
             if(resultCode == RESULT_OK){      
                 //String result=data.getStringExtra("result");
                 finish();
             }
          }
    

    2) 在 B Activity 中,在启动 C Activity 时添加: 意图启动; 开始 = 新意图(B.this,C.class); startActivityForResult(start,1);

    在你的 B 活动中再次这样做:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          if (requestCode == 1) {
             if(resultCode == RESULT_OK){      
                 //String result=data.getStringExtra("result");
                 finish();
             }
          }
    

    3) 在您的 C 活动中,将此添加到您的 press 方法中:

            Intent start;
            start = new Intent(C.this,A.class);
            // pass any data back to A activity 
            start.putExtra("Key", String);
            startActivity(start);
            // to close previous activities 
            Intent returnIntent = new Intent();
            //returnIntent.putExtra("result","finish");
            setResult(RESULT_OK,returnIntent);     
            // close current activity
            finish();
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 2019-11-18
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2016-05-29
      相关资源
      最近更新 更多