android clear,Android: Clear Activity Stack

I'm having several activities in my application. and flow is very complicated. When I click the Logout application naviagates to login Screen and from there user can exit by cancel buton (calling system.exit(0) )

when I exit or back button, system invokes an activity from stack :( how can I clear all the activities in the stack when i reach Login screen? calling finish() is not practical as there are so many activities and some activities should no be closed when they are active such as native camera invoking activity.

validateuser logoutuser = new validateuser();

logoutuser.logOut();

Intent loginscreen = new Intent(homepage.this, Login2.class);

(homepage.this).finish();

loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);

startActivity(loginscreen);

Cynichniy Bandera

Most of you are wrong. If you want to close existing activity stack regardless of what's in there and create new root, correct set of flags is the following:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

public static final int FLAG_ACTIVITY_CLEAR_TASK

Added in API level 11

If set in an Intent passed to

Context.startActivity(), this flag will cause any existing task that

would be associated with the activity to be cleared before the

activity is started. That is, the activity becomes the new root of an

otherwise empty task, and any old activities are finished. This can

only be used in conjunction with FLAG_ACTIVITY_NEW_TASK.

David Olsson

When you call startActivity on the last activity you could always use

Intent.FLAG_ACTIVITY_CLEAR_TOP

as a flag on that intent.

Read more about the flag here.

Here is a simple helper method for starting a new activity as the new top activity which works from API level 4 up until the current version 17:

static void startNewMainActivity(Activity currentActivity, Class extends Activity> newTopActivityClass) {

Intent intent = new Intent(currentActivity, newTopActivityClass);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)

intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11

currentActivity.startActivity(intent);

}

call it like this from your current activity:

startNewMainActivity(this, MainActivity.class);

Clear Activity Backstate by below code:

Intent intent = new Intent(Your_Current_Activity.this, Your_Destination_Activity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent);

Done

In my case, LoginActivity was closed as well. As a result,

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK

did not help.

However, setting

Intent.FLAG_ACTIVITY_NEW_TASK

helped me.

Sakib Syed

Intent intent = new Intent(LoginActivity.this, Home.class);

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //It is use to finish current activity

startActivity(intent);

this.finish();

This decision works fine:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

But new activity launch long and you see white screen some time. If this is critical then use this workaround:

public class BaseActivity extends AppCompatActivity {

private static final String ACTION_FINISH = "action_finish";

private BroadcastReceiver finisBroadcastReceiver;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

registerReceiver(finisBroadcastReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

finish();

}

}, new IntentFilter(ACTION_FINISH));

}

public void clearBackStack() {

sendBroadcast(new Intent(ACTION_FINISH));

}

@Override

protected void onDestroy() {

unregisterReceiver(finisBroadcastReceiver);

super.onDestroy();

}

}

How use it:

public class ActivityA extends BaseActivity {

// Click any button

public void startActivityB() {

startActivity(new Intent(this, ActivityB.class));

clearBackStack();

}

}

Disadvantage: all activities that must be closed on the stack must extends BaseActivity

I noted that you asked for a solution that does not rely on finish(), but I wonder if this may help nonetheless.

I tracked whether an exit flag is raised with a static class variable, which survives the entire app lifespan. In each relevant activity's onResume(), use

@Override

public void onResume() {

super.onResume();

if (ExitHelper.isExitFlagRaised) {

this.finish();

}

}

The ExitHelper class

public class ExitHelper {

public static boolean isExitFlagRaised = false;

}

Let's say in mainActivity, a user presses a button to exit - you can set ExitHelper.isExitFlagRaised = true; and then finish(). Thereafter, other relevant activities that are resumed automatically will be finished as well.

For Xamarin Developers, you can use:

intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);

来源:https://stackoverflow.com/questions/7075349/android-clear-activity-stack

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值