【问题标题】:Keep Activities in stack, but return only to the main将活动保留在堆栈中,但仅返回到主
【发布时间】:2017-08-24 10:12:31
【问题描述】:

我有九项活动。例如,活动“A”是主要活动。用户从 NavigationDrawer 打开活动“B”、“С”、“D”并在“D”中单击“返回”按钮。在这种情况下,需要返回到 Activity “A”,而不是通过整个最近打开的 Activity 堆栈。

这段代码可以满足我的需要:

@Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Handler mHandler = new Handler();
        drawerLayout.closeDrawers();
        switch (item.getItemId()) {
            case R.id.A:
                if (item.isChecked()) {
                    break;
                } else {
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            intent = new Intent(activity, A.class);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                            activity.startActivity(intent);
                        }
                    }, 250);
                }
                break;
            case R.id.B:
                if (item.isChecked()) {
                    break;
                } else {
                    if (activity instanceof A) {
                        userFlavorsMap.clear();
                        if (flavorContainer.getChildCount() > 0){
                            flavorContainer.removeAllViews();
                        }
                    }
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            intent = new Intent(activity, B.class);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                            activity.startActivity(intent);
                        }
                    }, 250);
                }
                break;
            case R.id.C:
                if (item.isChecked()) {
                    break;
                } else {
                    if (activity instanceof A) {
                        userFlavorsMap.clear();
                        if (flavorContainer.getChildCount() > 0){
                            flavorContainer.removeAllViews();
                        }
                    }
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            intent = new Intent(activity, C.class);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                            activity.startActivity(intent);
                        }
                    }, 250);
                }
                break;
            case R.id.D:
                if (item.isChecked()) {
                    break;
                } else {
                    if (activity instanceof A) {
                        userFlavorsMap.clear();
                        if (flavorContainer.getChildCount() > 0){
                            flavorContainer.removeAllViews();
                        }
                    }
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            intent = new Intent(activity, D.class);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                            activity.startActivity(intent);
                        }
                    }, 250);
                }
                break;
            case R.id.E:
                if (item.isChecked()) {
                    break;
                } else {
                    if (activity instanceof A) {
                        userFlavorsMap.clear();
                        if (flavorContainer.getChildCount() > 0){
                            flavorContainer.removeAllViews();
                        }
                    }
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            intent = new Intent(activity, E.class);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                            activity.startActivity(intent);
                        }
                    }, 250);
                }
                break;
            case R.id.F:
                File usersCounter = new File("data/data/com.com.com/shared_prefs/file.xml");
                if (usersCounter.exists()) {
                    if (item.isChecked()) {
                        break;
                    } else {
                        if (activity instanceof A) {
                            userFlavorsMap.clear();
                            if (flavorContainer.getChildCount() > 0){
                                flavorContainer.removeAllViews();
                            }
                        }
                        mHandler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                intent = new Intent(activity, F.class);
                                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                                activity.startActivity(intent);
                            }
                        }, 250);
                    }
                    break;
                } else {
                    if (item.isChecked()) {
                        break;
                    } else {
                        if (activity instanceof A) {
                            userFlavorsMap.clear();
                            if (flavorContainer.getChildCount() > 0){
                                flavorContainer.removeAllViews();
                            }
                        }
                        mHandler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                intent = new Intent(activity, G.class);
                                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                                activity.startActivity(intent);
                            }
                        }, 250);
                    }
                    break;
                }
        }
        return false;
    }

但是,如果用户切换到Activity,例如“C”并折叠应用程序,那么返回应用程序后会打开“A”。如何完成代码,以便当我返回应用程序时,它会打开最后打开的 Activity,但所有最近的 Activity 都不会在堆栈中?

在manifect android:launchMode="singleTop"

【问题讨论】:

  • 覆盖 onBackPressed 方法并在那里开始主要活动
  • 如果您不想返回某些活动,请在打开下一个活动时finish()他们。因此,当您按回时,它们不在堆栈中,只是 A。

标签: java android android-activity


【解决方案1】:

在除 MainActivity 之外的每个活动中尝试此操作

 @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent mainIntent = new Intent(YourCurrentActivityName.this,MainActivity.class);
        startActivity(mainIntent);
        finish();
    }

【讨论】:

  • 如果你要走这条路,你需要正确的标志。否则,从 A 向后按将带您回到刚刚关闭的活动之前的活动。例如B 或 C
  • 但是在这种情况下我会丢失在 MainActivity 中输入的信息。是否有带有标志或启动模式的解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2014-10-21
  • 2012-10-14
相关资源
最近更新 更多