My problem is I have a SplashActivity that runs each time app is launched and when a notification is received when app is in the background I start the SplashActivity (that how it works now and it works but it gives the feeling the app is relaunched every time user responds to a notification and some unnecessary server updates are happening).
What I want to do is:
if (app is in background) {
if (running) {
launch SomeActivity
} else {
launch SplashActivity
}
}
I went over a lot of posts and none of them helped me to reliably know when the app is running (I consider running in the background as running).
I'm able to detect wether app is in foreground or background (that's not a problem) but my problem is detecting "terminated" state.
I looked in to ActivityLifecycleCallbacks
in Application
but I can't see how it can reliably help me because onDestroy is not guaranteed to be called.
Anyone solved this issue?
Thanks
Edit:
I ended up using solution suggested in Google I/O 2016 video to detect background and foreground state and added a small addition in onActivityDestroyed
to detect my main activity onDestory
It's not perfect and could get the "app state" wrong if onDestory
of main tabs activity isn't called but this is what I ended up doing:
public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {
public static final int APP_STATE_FOREGROUND = 1000;
public static final int APP_STATE_BACKGROUND = 1001;
public static final int APP_STATE_TERMINATED = 1002;
private int mNumStarted;
private int mAppState;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
// set default app state to APP_STATE_TERMINATED in case app state is not certain so app will launch as if it is a new app launch when opened from push notification
mAppState = APP_STATE_TERMINATED;
}
public int getAppState() {
return mAppState;
}
/**
* Application.ActivityLifecycleCallbacks interface methods
*/
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
String activityName = activity.getLocalClassName();
if (activityName.equals("main.TabsActivity")) {
mAppState = APP_STATE_FOREGROUND;
}
}
@Override
public void onActivityStarted(Activity activity) {
if (mNumStarted == 0) {
mAppState = APP_STATE_FOREGROUND;
}
mNumStarted++;
}
@Override
public void onActivityResumed(Activity activity) {}
@Override
public void onActivityPaused(Activity activity) {}
@Override
public void onActivityStopped(Activity activity) {
mNumStarted--;
if (mNumStarted == 0) {
mAppState = APP_STATE_BACKGROUND;
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
@Override
public void onActivityDestroyed(Activity activity) {
String activityName = activity.getLocalClassName();
if (activityName.equals("main.TabsActivity")) {
mAppState = APP_STATE_TERMINATED;
}
}
}
This solution works for me (for now), maybe it will help someone else.