Handle activity back stack
I have 4 activities:
- MainActivity (launcher) - checks if user is logged in then start ContainerActivity else IntroActivity
- IntroActivity - shows various login methods including facebook login
- LoginActivity - contains phone or email login method. After successful login start ContainerActivity
- ContainerActivity - main application
I have 2 problems.
First, I want to remove IntroActivity
from stack when user successfully login from LoginActivity
. Can't use android:noHistory="true"
because when user decides to use facebook to login not phone or email, IntroActivity
should be in stack.
Second, when user logout from any activity, I want to back to MainActivity
and clearing all back stack. I will add activities in future. What is the right way to do this?
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.Launcher"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".intro.IntroActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
<activity
android:name=".authentication.LoginActivity"
android:parentActivityName=".intro.IntroActivity"
android:noHistory="true" />
android android-activity
add a comment |
I have 4 activities:
- MainActivity (launcher) - checks if user is logged in then start ContainerActivity else IntroActivity
- IntroActivity - shows various login methods including facebook login
- LoginActivity - contains phone or email login method. After successful login start ContainerActivity
- ContainerActivity - main application
I have 2 problems.
First, I want to remove IntroActivity
from stack when user successfully login from LoginActivity
. Can't use android:noHistory="true"
because when user decides to use facebook to login not phone or email, IntroActivity
should be in stack.
Second, when user logout from any activity, I want to back to MainActivity
and clearing all back stack. I will add activities in future. What is the right way to do this?
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.Launcher"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".intro.IntroActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
<activity
android:name=".authentication.LoginActivity"
android:parentActivityName=".intro.IntroActivity"
android:noHistory="true" />
android android-activity
This is not a Firebase related issue. Please don't add tags that do not correspond with your problem.
– Alex Mamo
Nov 15 '18 at 12:15
add a comment |
I have 4 activities:
- MainActivity (launcher) - checks if user is logged in then start ContainerActivity else IntroActivity
- IntroActivity - shows various login methods including facebook login
- LoginActivity - contains phone or email login method. After successful login start ContainerActivity
- ContainerActivity - main application
I have 2 problems.
First, I want to remove IntroActivity
from stack when user successfully login from LoginActivity
. Can't use android:noHistory="true"
because when user decides to use facebook to login not phone or email, IntroActivity
should be in stack.
Second, when user logout from any activity, I want to back to MainActivity
and clearing all back stack. I will add activities in future. What is the right way to do this?
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.Launcher"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".intro.IntroActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
<activity
android:name=".authentication.LoginActivity"
android:parentActivityName=".intro.IntroActivity"
android:noHistory="true" />
android android-activity
I have 4 activities:
- MainActivity (launcher) - checks if user is logged in then start ContainerActivity else IntroActivity
- IntroActivity - shows various login methods including facebook login
- LoginActivity - contains phone or email login method. After successful login start ContainerActivity
- ContainerActivity - main application
I have 2 problems.
First, I want to remove IntroActivity
from stack when user successfully login from LoginActivity
. Can't use android:noHistory="true"
because when user decides to use facebook to login not phone or email, IntroActivity
should be in stack.
Second, when user logout from any activity, I want to back to MainActivity
and clearing all back stack. I will add activities in future. What is the right way to do this?
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.Launcher"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".intro.IntroActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
<activity
android:name=".authentication.LoginActivity"
android:parentActivityName=".intro.IntroActivity"
android:noHistory="true" />
android android-activity
android android-activity
edited Nov 15 '18 at 12:16
Alex Mamo
44.7k82862
44.7k82862
asked Nov 15 '18 at 10:30
Мөнхбаатар ГанбаатарМөнхбаатар Ганбаатар
135
135
This is not a Firebase related issue. Please don't add tags that do not correspond with your problem.
– Alex Mamo
Nov 15 '18 at 12:15
add a comment |
This is not a Firebase related issue. Please don't add tags that do not correspond with your problem.
– Alex Mamo
Nov 15 '18 at 12:15
This is not a Firebase related issue. Please don't add tags that do not correspond with your problem.
– Alex Mamo
Nov 15 '18 at 12:15
This is not a Firebase related issue. Please don't add tags that do not correspond with your problem.
– Alex Mamo
Nov 15 '18 at 12:15
add a comment |
2 Answers
2
active
oldest
votes
To remove IntroActivity
from stack after successful login, I would do this:
Assuming that LoginActivity
should also be finished (removed from the stack) on successful login, you can call startActivity()
to return to IntroActivity
and add an "extra" to the Intent
telling IntroActivity
to start ContainerActivity
and finish itself. Do this:
in LoginActivity
:
Intent intent = new Intent(this, IntroActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("startContainerActivity", true);
startActivity(intent);
finish();
in IntroActivity.onNewIntent()
:
if (intent.hasExtra("startContainerActivity")) {
Intent launchIntent = new Intent(this, ContainerActivity.class);
startActivity(launchIntent);
finish();
}
IntroActivity
will then launch ContainerActivity
and finish itself, leaving the stack: MainActivity->ContainerActivity
.
To return to MainActivity
from any other Activity
, you just need to override onBackPressed()
and return to MainActivity
.
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();
}
When you specify the flags CLEAR_TOP
and SINGLE_TOP
this tells Android to remove all the activities on top of the target Activity
and to reuse the target Activity
(ie: not create a new instance of the target Activity
). In this case, onNewIntent()
is called on the existing instance of the Activity
.
add a comment |
You can start IntoActivity using startActivityForResult
and in LoginActivity after successfully loged in, you can set result RESULT_OK
and in IntroActivity onActivityResult
check for result code and finish IntoActivity.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53317380%2fhandle-activity-back-stack%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
To remove IntroActivity
from stack after successful login, I would do this:
Assuming that LoginActivity
should also be finished (removed from the stack) on successful login, you can call startActivity()
to return to IntroActivity
and add an "extra" to the Intent
telling IntroActivity
to start ContainerActivity
and finish itself. Do this:
in LoginActivity
:
Intent intent = new Intent(this, IntroActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("startContainerActivity", true);
startActivity(intent);
finish();
in IntroActivity.onNewIntent()
:
if (intent.hasExtra("startContainerActivity")) {
Intent launchIntent = new Intent(this, ContainerActivity.class);
startActivity(launchIntent);
finish();
}
IntroActivity
will then launch ContainerActivity
and finish itself, leaving the stack: MainActivity->ContainerActivity
.
To return to MainActivity
from any other Activity
, you just need to override onBackPressed()
and return to MainActivity
.
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();
}
When you specify the flags CLEAR_TOP
and SINGLE_TOP
this tells Android to remove all the activities on top of the target Activity
and to reuse the target Activity
(ie: not create a new instance of the target Activity
). In this case, onNewIntent()
is called on the existing instance of the Activity
.
add a comment |
To remove IntroActivity
from stack after successful login, I would do this:
Assuming that LoginActivity
should also be finished (removed from the stack) on successful login, you can call startActivity()
to return to IntroActivity
and add an "extra" to the Intent
telling IntroActivity
to start ContainerActivity
and finish itself. Do this:
in LoginActivity
:
Intent intent = new Intent(this, IntroActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("startContainerActivity", true);
startActivity(intent);
finish();
in IntroActivity.onNewIntent()
:
if (intent.hasExtra("startContainerActivity")) {
Intent launchIntent = new Intent(this, ContainerActivity.class);
startActivity(launchIntent);
finish();
}
IntroActivity
will then launch ContainerActivity
and finish itself, leaving the stack: MainActivity->ContainerActivity
.
To return to MainActivity
from any other Activity
, you just need to override onBackPressed()
and return to MainActivity
.
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();
}
When you specify the flags CLEAR_TOP
and SINGLE_TOP
this tells Android to remove all the activities on top of the target Activity
and to reuse the target Activity
(ie: not create a new instance of the target Activity
). In this case, onNewIntent()
is called on the existing instance of the Activity
.
add a comment |
To remove IntroActivity
from stack after successful login, I would do this:
Assuming that LoginActivity
should also be finished (removed from the stack) on successful login, you can call startActivity()
to return to IntroActivity
and add an "extra" to the Intent
telling IntroActivity
to start ContainerActivity
and finish itself. Do this:
in LoginActivity
:
Intent intent = new Intent(this, IntroActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("startContainerActivity", true);
startActivity(intent);
finish();
in IntroActivity.onNewIntent()
:
if (intent.hasExtra("startContainerActivity")) {
Intent launchIntent = new Intent(this, ContainerActivity.class);
startActivity(launchIntent);
finish();
}
IntroActivity
will then launch ContainerActivity
and finish itself, leaving the stack: MainActivity->ContainerActivity
.
To return to MainActivity
from any other Activity
, you just need to override onBackPressed()
and return to MainActivity
.
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();
}
When you specify the flags CLEAR_TOP
and SINGLE_TOP
this tells Android to remove all the activities on top of the target Activity
and to reuse the target Activity
(ie: not create a new instance of the target Activity
). In this case, onNewIntent()
is called on the existing instance of the Activity
.
To remove IntroActivity
from stack after successful login, I would do this:
Assuming that LoginActivity
should also be finished (removed from the stack) on successful login, you can call startActivity()
to return to IntroActivity
and add an "extra" to the Intent
telling IntroActivity
to start ContainerActivity
and finish itself. Do this:
in LoginActivity
:
Intent intent = new Intent(this, IntroActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("startContainerActivity", true);
startActivity(intent);
finish();
in IntroActivity.onNewIntent()
:
if (intent.hasExtra("startContainerActivity")) {
Intent launchIntent = new Intent(this, ContainerActivity.class);
startActivity(launchIntent);
finish();
}
IntroActivity
will then launch ContainerActivity
and finish itself, leaving the stack: MainActivity->ContainerActivity
.
To return to MainActivity
from any other Activity
, you just need to override onBackPressed()
and return to MainActivity
.
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();
}
When you specify the flags CLEAR_TOP
and SINGLE_TOP
this tells Android to remove all the activities on top of the target Activity
and to reuse the target Activity
(ie: not create a new instance of the target Activity
). In this case, onNewIntent()
is called on the existing instance of the Activity
.
answered Nov 15 '18 at 20:03
David WasserDavid Wasser
69.4k10141201
69.4k10141201
add a comment |
add a comment |
You can start IntoActivity using startActivityForResult
and in LoginActivity after successfully loged in, you can set result RESULT_OK
and in IntroActivity onActivityResult
check for result code and finish IntoActivity.
add a comment |
You can start IntoActivity using startActivityForResult
and in LoginActivity after successfully loged in, you can set result RESULT_OK
and in IntroActivity onActivityResult
check for result code and finish IntoActivity.
add a comment |
You can start IntoActivity using startActivityForResult
and in LoginActivity after successfully loged in, you can set result RESULT_OK
and in IntroActivity onActivityResult
check for result code and finish IntoActivity.
You can start IntoActivity using startActivityForResult
and in LoginActivity after successfully loged in, you can set result RESULT_OK
and in IntroActivity onActivityResult
check for result code and finish IntoActivity.
answered Nov 15 '18 at 11:50
SANDIP CHAUDHARISANDIP CHAUDHARI
8115
8115
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53317380%2fhandle-activity-back-stack%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
This is not a Firebase related issue. Please don't add tags that do not correspond with your problem.
– Alex Mamo
Nov 15 '18 at 12:15