You need to cache the activity that displays the 3rd party app so it does not get recreated in your ActivityMapper each time you navigate inside the 3rd party app. So your URLs should look like
/#ThirdPartyAppPlace:app=page1
/#ThirdPartyAppPlace:app=page2¶m=x
/#ThirdPartyAppPlace:app=page3
and for each URL the same activity instance should be returned. You could either code this caching into your AppActivityMapper directly or use GWT's CachingActivityMapper together with GWT's FilteredActivityMapper to keep your AppActivityMapper clean. If you choose to use GWT's ActivityMappers you must implement hashcode/equals for your place because CachingActivityMapper uses currentPlace.equals(newPlace) to determine if the cached activity can be returned.
At the end you will have something like new FilteredActivityMapper(filter, new CachingActivityMapper(new AppActivityMapper()); where "filter" transforms all your ThirdPartyAppPlaces to an empty ThirdPartyAppPlace so that CachingActivityMapper always sees equal places. Whenever the CachingActivityMapper sees different places, it will ask your AppActivityMapper for the new activity.
-- J.