让onBackPressed()关闭应用程序

时间:2013-04-12 15:56:55

标签: android android-fragments back-stack

我有一个使用片段的应用程序。在应用程序启动时,我这样做:

    FragmentManager man = getFragmentManager();
    FragmentTransaction trans = man.beginTransaction();
    trans.replace(R.id.master_container, master);
    trans.commit();

正如您所看到的,我不会将其添加到Backstack中,因为我不希望用户被捕获到没有片段的空活动中。然而,这不起作用。因为当我按下master屏幕中的后退按钮时,它会关闭片段并让我处于黑色活动状态。 现在我重写onBackPressed()方法来帮助我:

@Override
public void onBackPressed() {

    // 'master' is the Mainscreen Fragment
    if (master.isVisible()) {

        if (!second) {
            Toast.makeText(getApplication(), "Press back again to close application", Toast.LENGTH_SHORT).show();
            second = true;
        } else {
            second = false;
            CreamyActivity.this.finish();
        }

    } else {
        super.onBackPressed();
        bar.show();
    }
}

但是每当CreamyActivity.this.finish();它再次关闭片段并进入空白活动时(好像它只是跟在后台)(这就是活动btw!)

我想知道你是否可以帮助我。通常应用程序不应该关闭自己,但我真的很感激这里的解决方法。或者我是在做背板上的错误吗?是否会自动添加它?

提前致谢< 3

1 个答案:

答案 0 :(得分:0)

好的CommonsWare(感谢你!)指出,还有一些其他因素干扰了应用程序的运行。它的结构如下:

App Launch - > LaunchActivity if(API> 14) - > CreamyActivty

其他 - > CrunchyActivity

当在CreamyActivity中调用finish()时,它使应用程序返回到LaunchActivity,除了if-else语句之外,它还没有其他内容的onCreate()。现在我已经这样做了:

我的LaunchActivity我添加了:

    private IntentFilter filter;

    filter = new IntentFilter(Util.BACKSTACK_INTENT);

    registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            LaunchActivity.this.finish();
            unregisterReceiver(this);

        }
    }, filter);

在Creamy / Crunchy Activities的onBackPressed()方法中我添加了这个:

            CreamyActivity.this.finish();
            Intent kill = new Intent();
            kill.setAction(Util.BACKSTACK_INTENT);
            this.sendBroadcast(kill);

每次用户想要离开应用程序时都会像这样,它会将一个意图发送回LaunchActivity并终止那个。

再次。非常感谢CommonsWare指出了之前设计中的缺陷:P希望这有助于某人。