It sounds like you have a pretty decent understanding of the concepts. I have used the Activities / Places API several times, and I still find it confusing. Here is another overview of how you can think about components:
PlaceController is what you use to tell the ActivityManager where to go next, using goTo.
ActivityManager - controls the actions. Allows start, stop, show, ect.
ActivityMapper - Think of it as a factory. He knows what activity should be created on the basis of a certain place. Here I usually add my RPC service.
A place. Think of it as an “address” to a specific view in an application. PlaceTokenizer is usually listed here, but it is more convenient.
PlaceHistoryMapper is a class that will take a url token, and using the PlaceTokenizers you specify, create a Place from it.
Act. The activity code should be able to take the Place object and get your application in this place. If two Place objects are the same, they should show the same thing every time.
Here is a (probably not stellar) example of a test application that I wrote that uses Jobs. I have two parts of the application that use this: https://github.com/aglassman/jgoo/tree/master/JGoo/src/com/jgoo/client/appnav https://github.com/aglassman/jgoo/ tree / master / JGoo / src / com / jgoo / client / crud / nav
Events Places are created here: https://github.com/aglassman/jgoo/blob/master/JGoo/src/com/jgoo/client/CrudLauncher.java
Here is a test application in action, you can see different ways to use PlaceTokenizers to access different views. (Please note that the data warehouse sometimes takes a few seconds to initialize, so if you "Get All" it may take some time to load (there is no boot counter, but it works). If you click on the result text, it will lead you to view of the object.
http://jgoo-sample.appspot.com/
Hope this helps!
UPDATE: added an example of an action as it relates to MVP
In my example below, a PlaceTokenizer supplies an activity type, and if editing is requested, a UUID is provided to map to a specific contact. I use Activity as a high-level leader, pretty much just to provide the lower-level leader with the raw data in the information that he needs to execute. In the lower level view, in this case RequestEditWidget and ContactInfoWidget, I use UIBinder to create the view. Please note that currently I have no way to use canStop / onStop methods, but this will just be additional code for interacting with my widgets.
Each of these (edit, subscribe, request_edit) could have everything in its activity, but I wanted all of them to have the same place prefix.
package contactmanager.client.nav; import contactmanager.client.ContactManagerServiceAsync; import contactmanager.client.callback.BasicCallback; import contactmanager.client.contact.info.ContactInfoWidget; import contactmanager.client.contact.info.RequestEditWidget; import contactmanager.shared.bundle.InitDataBundle; import com.google.gwt.activity.shared.AbstractActivity; import com.google.gwt.event.shared.EventBus; import com.google.gwt.place.shared.PlaceController; import com.google.gwt.user.client.ui.AcceptsOneWidget; public class ContactActivity extends AbstractActivity{ public enum Activity { request_edit, edit, subscribe } private ContactManagerServiceAsync cmsa; private ContactPlace place; private PlaceController pc; public ContactActivity(PlaceController pc, ContactManagerServiceAsync cmsa,ContactPlace place) { this.pc = pc; this.cmsa = cmsa; this.place = place; } public void start(AcceptsOneWidget panel, EventBus eventBus) { switch(place.activity) { case request_edit: loadRequestEditPanel(panel); break; case edit: loadEditPanel(panel); break; case subscribe: loadSubscribePanel(panel); break; } } private void loadSubscribePanel(final AcceptsOneWidget panel) { cmsa.getInitDataBundle(new BasicCallback<InitDataBundle>() { @Override public void onSuccess(InitDataBundle result) { panel.setWidget(new ContactInfoWidget(pc,cmsa,result,null).getWidget()); } }); } private void loadRequestEditPanel(final AcceptsOneWidget panel) { panel.setWidget(new RequestEditWidget(pc,cmsa).getWidget()); } private void loadEditPanel(final AcceptsOneWidget panel) { cmsa.getInitDataBundle(new BasicCallback<InitDataBundle>() { public void onSuccess(InitDataBundle result) { panel.setWidget(new ContactInfoWidget(pc,cmsa,result,place.uuid).getWidget()); } }); } }