سؤال

Here's the scenario:

  1. In activity A I have "post to Twitter" option which calls activity B that executes the post and returns to A by executing Activity#finish() and the flow is A->B->A
  2. However, if I'm not logged into Twitter then the B activity calls Twitter mobile OAuth page in the browser. Then browser redirects user back to B. However when B is done and I call Activity#finish() I'm returning back to the browser login page which is expected since the stack is now A->B->browser->B.

How do I go 3 steps back instead of just one? Is it even possible? I don't want to call A anew since at the very least I will lose a list position

هل كانت مفيدة؟

المحلول

You can do this with FLAG_ACTIVITY_CLEAR_TOP and FLAG_ACTIVITY_SINGLE_TOP.

You need to launch A as a new Intent but set those two flags before calling startActivity

Clear Top causes all activities on top of A to get cleared away.

Single Top causes the intent to be delivered to A's onNewIntent method instead of destroying and recreating A.

From the docs:

If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent. For example, consider a task consisting of the activities: A, B, C, D. If D calls startActivity() with an Intent that resolves to the component of activity B, then C and D will be finished and B receive the given Intent, resulting in the stack now being: A, B. The currently running instance of activity B in the above example will either receive the new intent you are starting here in its onNewIntent() method, or be itself finished and restarted with the new intent. If it has declared its launch mode to be "multiple" (the default) and you have not set FLAG_ACTIVITY_SINGLE_TOP in the same intent, then it will be finished and re-created; for all other launch modes or if FLAG_ACTIVITY_SINGLE_TOP is set then this Intent will be delivered to the current instance's onNewIntent(). This launch mode can also be used to good effect in conjunction with FLAG_ACTIVITY_NEW_TASK: if used to start the root activity of a task, it will bring any currently running instance of that task to the foreground, and then clear it to its root state. This is especially useful, for example, when launching an activity from the notification manager. See Tasks and Back Stack for more information about tasks.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top