How can I know that OnResume comes after onCreate?
Asked Answered
P

7

17

I have few activities and from one activity I open another and that go back to the first one...

The point is onCreate is called ones , and onResume every time when the activity is show. For example when I close B that was previouslly started from A, the onResume is called but not onCreate....

my problem is that I do not want to run the onResume if it comes after onCreate, I want to run the code only if onCreate wasn't called

Is this possible to do WITHOUT static flag ?

is there some method or flag from android like comesAfterOnCreate ?

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

I show a lot of answers with solution using static flag, Thanks to all of you for the effort and offering the help, but I was interested is there some method or something...

Perception answered 20/9, 2011 at 11:49 Comment(6)
Why not add a boolean yourself, you can set it to true in the onCreate method, evaluate in onResume, and set it to false there.Reduction
please also show your onCreate methodComedy
you can't change the order of lifecycle methods execution. If u want you can call onResume in your onCreate. set one boolean flag to false initially then set it to true in onCreate and call onResume. Perform what you want if flag is set in onResume method.Andromede
But why don't you want the flag? It is the easiest and simplest solution.Reduction
Because I have really nasty program with a lot of threads, and I do not want to synchronize the flag to be thread safe cause I causes it acts sluggish I do not why is that . . . It is probably I do some stupid mistake in synchronizationPerception
I guess that I will have to review more closely the logic with thread safe stuff in my program.Perception
B
2

its not a difficult job, you can use boolean or see here Is that possible to check was onCreate called because of orientation change?

Blackguard answered 20/9, 2011 at 11:59 Comment(1)
This is not the answer to my question but it was in right direction, thanks :), at least someone understand me what I want to achievePerception
B
6

Try this,

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()
               }
    }

Now, when the Acitivity will finish the value of flag will be false again and onResume() will be called with value false.

Hope this works for you.

Barthold answered 20/9, 2011 at 11:58 Comment(1)
This is pretty bad since onResume can be called multiple times after the activity has created, and every time you'll understand it as it's coming from onCreate.Sukhum
R
3

So as in my comment:

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
    }
}
Reduction answered 20/9, 2011 at 12:3 Comment(0)
B
2

its not a difficult job, you can use boolean or see here Is that possible to check was onCreate called because of orientation change?

Blackguard answered 20/9, 2011 at 11:59 Comment(1)
This is not the answer to my question but it was in right direction, thanks :), at least someone understand me what I want to achievePerception
I
1

As shown in the Activity - Android Documentation.

An activity has essentially four states:

1. If an activity in the foreground of the screen (at the top of the stack), it is active or running.

2. If an activity has lost focus but is still visible (that is, a new non-full-sized or transparent activity has focus on top of your activity), it is paused. A paused activity is completely alive (it maintains all state and member information and remains attached to the window manager), but can be killed by the system in extreme low memory situations.

3. If an activity is completely obscured by another activity, it is stopped. It still retains all state and member information, however, it is no longer visible to the user so its window is hidden and it will often be killed by the system when memory is needed elsewhere.

4. If an activity is paused or stopped, the system can drop the activity from memory by either asking it to finish, or simply killing its process. When it is displayed again to the user, it must be completely restarted and restored to its previous state.

Here is the lifecycle of an activity, as shown in the Android documentation:

enter image description here

There are three key loops you may be interested in monitoring within your activity:

1. The entire lifetime of an activity happens between the first call to onCreate(Bundle) through to a single final call to onDestroy(). An activity will do all setup of "global" state in onCreate(), and release all remaining resources in onDestroy(). For example, if it has a thread running in the background to download data from the network, it may create that thread in onCreate() and then stop the thread in onDestroy().

2. The visible lifetime of an activity happens between a call to onStart() until a corresponding call to onStop(). During this time the user can see the activity on-screen, though it may not be in the foreground and interacting with the user. Between these two methods you can maintain resources that are needed to show the activity to the user. For example, you can register a BroadcastReceiver in onStart() to monitor for changes that impact your UI, and unregister it in onStop() when the user an no longer see what you are displaying. The onStart() and onStop() methods can be called multiple times, as the activity becomes visible and hidden to the user.

3. The foreground lifetime of an activity happens between a call to onResume() until a corresponding call to onPause(). During this time the activity is in front of all other activities and interacting with the user. An activity can frequently go between the resumed and paused states -- for example when the device goes to sleep, when an activity result is delivered, when a new intent is delivered -- so the code in these methods should be fairly lightweight.

Conclusion: You can't change the order of lifecycle execution.

Intracardiac answered 20/9, 2011 at 11:58 Comment(3)
Conclusion: That was not the question.Reduction
But one should know the life cycle of Activity to know weather onCreate() will call first or onResume() will call. @Intracardiac Nice explanation upVote from me.Faro
That diagram would be infinitely more valuable if it contained the labels "the app is running in the background" and "the app is reopening after being in the background".Safier
L
0

Try including toasts in OnCreate and OnResume and test if the "onResume" toast comes when you run the app before the OnCreate toast. Or print a Log message from the respective methods

Lsd answered 20/9, 2011 at 11:58 Comment(0)
S
0

I thing @suri is right. but if want to be more clear with onCreate() and onResume()

then put

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 <<<<<<<<<");

    }

This is simplest to check your question.

Steatopygia answered 20/9, 2011 at 12:25 Comment(0)
L
0

This can help other beginners:

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...
    }
}

See the result in Logcat!

Lien answered 16/5, 2019 at 8:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.