Pheonix7
Pheonix7

Reputation: 2191

intercept android application state background foreground

Does android have application state, like background or front (foreground)?

Basically whenever my app goes to the background (home button was pressed), if i then re-open it (making it go to foreground) i want to make an asyc call to my webserver, like a ping to my webserver. It should'nt matter in which activity im in.

I can't doo this with the Activity lifecycle methods as they work only for activities. I want something that works/acts on the whole application level. thanks

Upvotes: 1

Views: 548

Answers (3)

Apurv Mahesh
Apurv Mahesh

Reputation: 3

I am writing here the simplest answer to find if app is in foreground or background. No get Tasks and no such check. But the result is pretty definite and as per needed.

public class MainApplication extends Application implements Application.ActivityLifecycleCallbacks {
private static boolean background = false;
private static int count = 0;
@Override
public void onCreate() {
    super.onCreate();
    registerActivityLifecycleCallbacks(this);
}

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {

}

@Override
public void onActivityStarted(Activity activity) {
   if(background){
       background = false;
       Log.v("activityFocus", "Activity came in foreground ");
       Toast.makeText(getApplicationContext(), "Foreground", Toast.LENGTH_SHORT).show();
   }
}

@Override
public void onActivityResumed(Activity activity) {
    count++;
}

@Override
public void onActivityPaused(Activity activity) {
    count--;

}

@Override
public void onActivityStopped(Activity activity) {
 if(count==0){
     Log.v("activityFocus", "Activity is in background ");
     Toast.makeText(getApplicationContext(), "Background", Toast.LENGTH_SHORT).show();
     background=true;
 }
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

}

@Override
public void onActivityDestroyed(Activity activity) {

}

}

Upvotes: 0

rickul
rickul

Reputation: 1044

The simple answer is No, android doesn't provide such states.

After a lot of research I found a reliable and simple solution:

public class ApplicationLifecycleHandler implements Application.ActivityLifecycleCallbacks, ComponentCallbacks2 {

    private static final String TAG = ApplicationLifecycleHandler.class.getSimpleName();
    private static boolean isInBackground = false;

    @Override
    public void onActivityCreated(Activity activity, Bundle bundle) {
    }

    @Override
    public void onActivityStarted(Activity activity) {
    }

    @Override
    public void onActivityResumed(Activity activity) {
        Adjust.onResume();
        if(isInBackground){
            Log.d(TAG, "app went to foreground");
            isInBackground = false;
        }
    }

    @Override
    public void onActivityPaused(Activity activity) {
        Adjust.onPause();
    }

    @Override
    public void onActivityStopped(Activity activity) {
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
    }

    @Override
    public void onActivityDestroyed(Activity activity) {
    }

    @Override
    public void onConfigurationChanged(Configuration configuration) {
    }

    @Override
    public void onLowMemory() {
    }

    @Override
    public void onTrimMemory(int i) {
        if(i == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN){
            Log.d(TAG, "app went to background");
            isInBackground = true;
        }
    }
}

Upvotes: 0

Dante
Dante

Reputation: 1094

I'm not sure about your question, but I think you can have a BaseActivity and derive from that one and then onResume() will always be called right?

Upvotes: 1

Related Questions