我想关闭应用程序,但不要回到之前的活动

时间:2018-01-22 08:45:15

标签: android onbackpressed activity-finish

我在我的应用中使用了一个活动和几个部分 有时当我在第一页(活动)并且按下后不会退出应用程序并返回到片段或同一页面

当发生这种情况时,我在程序中做了很多工作

我用这段代码解决了这个问题但是 它也适用于片段

@Override
    public void onBackPressed() {
       this.finish();
    }

为什么要返回片段或同一页面

如何解决此问题

我现在正在使用

boolean doubleBackToExitPressedOnce = false;

    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            getSupportFragmentManager().popBackStack();
        } else if (!doubleBackToExitPressedOnce) {
            this.doubleBackToExitPressedOnce = true;
            Toast.makeText(this, "Click to exit again", Toast.LENGTH_SHORT).show();
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    doubleBackToExitPressedOnce = false;
                }
            }, 2000);
        } else {
            super.onBackPressed();
            return;
        }
    }

方式将成为一个片段

TabirFragment tabirFragment = new TabirFragment();
            Bundle bundle = new Bundle();
            bundle.putInt("id", id);
            bundle.putString("name", name);
            tabirFragment.setArguments(bundle);
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction().addToBackStack(null);
            transaction.replace(R.id.main_activity, tabirFragment).commit();

4 个答案:

答案 0 :(得分:1)

如果堆栈上有多个活动,则:

  

finish() - 完成调用它的活动,你看   以前的活动。

还有system.exit,但在您的情况下不起作用:

  

System.exit(0) - 重启应用程序,减少一个活动   堆。所以,如果你从ActivityA调用ActivityB,那么System.exit(0)   在ActivityB中调用,然后应用程序将被终止   立即开始只有一个活动ActivityA

我建议您使用finishAffinity()。它将完成当前活动以及紧接其下的所有活动。我提醒您,仅支持API级别16 +

答案 1 :(得分:0)

几件什么的?碎片,无法理解,无论如何你想管理frag和onBackPress,使用这个

 private void setUpBackStackListener() {
    getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Fragment currentFragment = getFragmentManager().findFragmentById(R.id.am_frameLayout);
            if (currentFragment != null) {

                int myCount = getFragmentManager().getBackStackEntryCount();
                if (LOG_DEBUG) Log.e(TAG, "backStackCount : " + myCount);

                String currentFragName = currentFragment.getClass().getSimpleName();

                if (currentFragName.equalsIgnoreCase(FragOne.class.getSimpleName())) {
                    shouldExit = true;

                } else if (currentFragName.equalsIgnoreCase(FragTwo.class.getSimpleName())) {
                    shouldExit = false;

                    }
                }
            }
        }
    });
}
 @Override
public void onBackPressed() {
    if (shouldExit == true) {
        if (LOG_DEBUG)
            Log.e(TAG, " Yeah exit douche:" + shouldExit + " isLastEntry : Testing :" + isLastEntry);
 super.onBackPressed();
    } else {
        getFragmentManager().popBackStack();
    }
}

,如果这不是你想要的,你可能想要以一种微妙的方式清除你想要的东西

答案 2 :(得分:0)

使用多个片段和活动时使用方法startActivity()切换活动时,请始终使用方法finish();当你按下后,你将永远不会获得多个活动和片段,并在主要活动上使用onBackPressed方法。

boolean doubleBackToExitPressedOnce=false;

@Override
public void onBackPressed() {
    //Checking for fragment count on backstack
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStack();
    } else if (!doubleBackToExitPressedOnce) {
        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this,"Please click back again to exit.", Toast.LENGTH_SHORT).show();

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000);
    } else {
        super.onBackPressed();
        return;
    }
}

答案 3 :(得分:0)

我能给你的最简单的解决方案是在清单文件中保留活动的无历史记录。然后覆盖每个活动的后退方法。

    <activity
        android:name=".example"
        android:noHistory="true">
    </activity>