16

我的活动很少,从一个活动中我打开另一个活动,然后回到第一个活动......

重点是 onCreate 被称为 one ,并且每次显示活动时都称为 onResume 。例如,当我关闭之前从 A 开始的 B 时,会调用 onResume 但不会调用 onCreate...。

我的问题是,如果 onResume 出现在 onCreate 之后,我不想运行它,我只想在未调用 onCreate 时运行代码

没有静态标志可以这样做吗?

是否有一些来自 android 的方法或标志,比如 comesAfterOnCreate ?

@Override
protected void onResume() {
   if(comesAfterOnCreate){
       //DO not run this code
   }else{
      //run the long task
   }

我使用静态标志显示了很多解决方案的答案,感谢你们所有人的努力和提供帮助,但我很感兴趣是否有一些方法或什么......

4

7 回答 7

6

尝试这个,

boolean flag = false;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

           flag = true;
....
}
@Override
    protected void onResume() {
        super.onResume();
              if(flag == true){
                 ..... // it has came from onCreate()
               }
               else{
                  .....// it has directly came to onResume()
               }
    }

现在,当 Acitivity 完成时,flag 的值将再次为 false,并以 falseonResume()值调用。

希望这对你有用。

于 2011-09-20T11:58:32.663 回答
2

就像我的评论一样:

private boolean onCreateRunned = false;

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    onCreateRunned = true;

    //More code
}

@Override
public void onResume(){
    super.onResume();
    if(onCreateRunned){
        onCreateRunned = false; //important, or it will run only once.
        // Do your code
    }
}
于 2011-09-20T12:03:09.367 回答
2

这不是一项艰巨的工作,您可以使用boolean或查看此处是否可以检查是否由于方向更改而调用了 onCreate?

于 2011-09-20T11:59:51.777 回答
1

Activity - Android 文档中所示。

一个活动基本上有四种状态:

1.如果一个activity在屏幕的前台(在栈顶),它是活跃的或者正在运行的。

2.如果一个活动失去了焦点但仍然可见(即一个新的非全尺寸或透明活动的焦点在你的活动之上),它被暂停。暂停的活动是完全活动的(它维护所有状态和成员信息并保持连接到窗口管理器),但可以在内存极低的情况下被系统杀死。

3.如果一个活动被另一个活动完全遮挡,则停止。它仍然保留所有状态和成员信息,但是,它不再对用户可见,因此它的窗口是隐藏的,并且当其他地方需要内存时,它通常会被系统杀死。

4.如果一个活动被暂停或停止,系统可以通过要求它完成或简单地终止它的进程来从内存中删除该活动。当它再次显示给用户时,它必须完全重新启动并恢复到之前的状态。

这是一个活动的生命周期,如 Android 文档中所示:

在此处输入图像描述

您可能有兴趣在活动中监控三个关键循环:

1. Activity 的整个生命周期发生在第一次调用 onCreate(Bundle) 到最后一次调用 onDestroy() 之间。一个活动将在 onCreate() 中完成所有“全局”状态的设置,并在 onDestroy() 中释放所有剩余资源。例如,如果它有一个线程在后台运行以从网络下载数据,它可能会在 onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。

2.活动的可见生命周期发生在对 onStart() 的调用与对 onStop() 的相应调用之间。在此期间,用户可以在屏幕上看到活动,尽管它可能不在前台并与用户交互。在这两种方法之间,您可以维护向用户显示活动所需的资源。例如,您可以在 onStart() 中注册一个 BroadcastReceiver 来监控影响 UI 的更改,并在用户不再看到您正在显示的内容时在 onStop() 中取消注册。onStart() 和 onStop() 方法可以多次调用,因为活动对用户可见和隐藏。

3.活动的前台生命周期发生在对 onResume() 的调用与对 onPause() 的相应调用之间。在此期间,活动位于所有其他活动之前并与用户交互。一个活动经常会在恢复和暂停状态之间切换——例如,当设备进入睡眠状态、传递活动结果时、传递新意图时——因此这些方法中的代码应该是相当轻量级的。

结论:您无法更改生命周期执行的顺序。

于 2011-09-20T11:58:48.987 回答
0

我觉得@suri 是对的。但如果想更清楚onCreate()onResume()

然后放

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

          System.out.println(">>>>>> This is oncreate method");
....
}

@Override
    protected void onResume() {
        super.onResume();

               System.out.println("This is onResume method <<<<<<<<<");

    }

这是检查您的问题的最简单方法。

于 2011-09-20T12:25:14.070 回答
0

尝试在 OnCreate 和 OnResume 中包含 toast,并测试在 OnCreate toast 之前运行应用程序时是否出现“onResume”toast。或者从相应的方法打印一条日志消息

于 2011-09-20T11:58:52.573 回答
0

这可以帮助其他初学者:

private boolean isOnCreateCalled = false;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
         Log.i("MyTag" , "onCreate called");
         isOnCreateCalled = true;
    }
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("MyTag" , "onResume called");
    if (isOnCreateCalled) {
        isOnCreateCalled = false;
        Log.i("MyTag" , "onResume's condition called once");
        // Your codes here...
    }
}

在Logcat中查看结果!

于 2019-05-16T08:38:03.047 回答