For internal activities CallSubDelayed is more powerful. You should call the second activity and when the result is read call Activity.Finish and CallSubDelayed to return the result.
Sorry if I insist, but of course I did not understand.
In your last post, now it seems to me the opposite.
For example, if I had an activity of "utility/service", a sort of dialog (not a real dialog), I call it "D". What I want to achieve is:
Activity "A" calls "D", "D" finishes its work and returns a value, in this case to "A". Same thing from the other activities.
From this your post, it seems to me, instead:
Start D activity, prepare the result, close the activity using Acvitity.Finish and then CallSubDelayed (A.SubDone (Result)).
.........
I looked now, after writing the above, your example:
Using CallSubDelayed to interact between activities and services.
Inside it, you use CallSubDelayed in both activities, but this requires the caller to know the calling activity and its methods.
Probably I'm stubborn, but it seems to me that to get what I described, only StartActivityForResult might work.