My Android application is being restarted when using the launcher to launch 
it after I have used the app store to launch it (and visa versa). Is there 
any way to prevent this?


By restarted I mean that the activity stack is lost. This is important as 
our users are setting up and returning to an activity in the app 
intermittently over the course of an hour or so. After first install, they 
will likely have installed and opened the app from the app store, set 
themselves up and then backgrounded the app. Later they are likely to open 
the app from the launcher and lose all their state!


The problem is further compounded as we start a foreground service along 
with the set-up activity. Clicking the services notification should bring 
the user back to the set-up activity but, as with the launcher, if the user 
originally opened the app from the Play store, they again lose all their 
state!


*Reproducing the problem*

I've made a sample application here:

https://github.com/samskiter/LaunchTest

Note: it uses the BBC weather application package Id in order to allow you 
to quickly open from the app store (the "Open" button will be shown on the 
BBC weather application if this app is installed).

Steps are as follows:

   1. Uninstall the BBC weather app if you have it
   2. Install the LaunchTest app
   3. Close the LaunchTest app from recents
   4. Open the LaunchTest app from the BBC weather app page on the Play 
   Store
   5. Click the button to navigate to the *Second* activity
   6. Background the application (press home)
   7. Open the LaunchTest application from the app launcher
   8. The state is lost! you are back at the *First* (root) activity
   
*What I've tried*

Using singleTask launch mode hasn't helped - it causes the app to be 
relaunched even if you use the launcher every time.

I've tried alwaysRetainTaskState - I don't really expect this to work as 
this only really affects things over about a 30 minute wait.


*What I think is going on*

There is no mechanism in the activity manager / intent system to open a 
running app in it's current state. Instead, I think the UID of the 
launching application is taken into account. If it is different then the 
Intent.FLAG_ACTIVITY_NEW_TASK flag is forced and so created a new task and 
dropping all my users' lovely state.


*Inspecting Google Maps*

Google maps has a very similar interaction model to our application: a 
setup UI, followed by an ongoing process the user is going through for a 
long period of time (navigation) with a paired, foreground service (the 
navigation service you can see in your notification bar). BUT GMaps doesn't 
suffer from this problem. I think this is because it uses only a single 
activity for all of it's interface *and* uses singleTask. So now, when you 
tap on the launcher after originally launching from the play store, the 
task can be reused.


In my opinion this exposes a hole in the android intent/activity management 
system. The whole point of the savedInstanceState/activity lifecycle is to 
prevent dropping state, but here we have a way to dump everything. My 
current best solution is to detect app restarts and try to get the user 
back to where they were, which is more than a little tricky.


*If someone knows a way I can prevent my state being dropped on the floor 
when reopening from the app launcher after opening from the store, I would 
really appreciate it.*

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to android-developers+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to