如何避免重新初始化需要很长时间才能初始化的活动

时间:2011-10-17 17:36:12

标签: android

我有一个带有两个屏幕的应用程序,以及在它们之间切换的按钮。一个屏幕主要是一个listView,但另一个屏幕中有一个游戏引擎(AndEngine),游戏引擎在第一次创建活动时可能需要一段时间才能启动。 因此,在进入新的游戏引擎时,它们之间的切换会导致很大的延迟。但是,如果我只使用后退按钮,则之前的游戏引擎加载速度要快得多。 有没有一种方法可以指定只创建一个游戏引擎并始终调出该活动的实例?现在我正在使用startIntent()来交换屏幕。还有其他方法吗? 一种允许我只拥有每个活动的单个实例并在它们之间交换的方法吗?

1 个答案:

答案 0 :(得分:3)

Android提供了一种使用TabHost在活动之间切换的简单方法。您也可以使用它在TabActivity下解释的片段之间切换。或者,您可以向活动添加FrameLayout,以编程方式实例化片段并在需要时附加/显示/隐藏它们。

你的res / layout / main.xml看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_height="fill_parent"
             android:layout_width="match_parent"
             android:id="@+id/mainframe">
</FrameLayout>

假设使用了v4支持库,您的活动将如下所示:

public MyActivity extends FragmentActivity {

    private Fragment mListFrag;
    private Fragment mGameFrag;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mListFrag = new MyListFragment();
        mGameFrag = new MyGameFragment();

        FragmentManager fm = getSupportFragmentManager();
        fm.beginTransaction()
            .add(
                R.id.mainframe,
                mListFrag,
                MyListFragment.class.getName())
            .add(
                R.id.mainframe,
                mGameFrag,
                MyGameFragment.class.getName())
            .detach(mGameFrag)
            .commit();

        fm.executePendingTransactions();
    }

    public void showList() {
        getSupportFragmentManager().beginTransaction()
            .hide(mGameFrag)
            .show(mListFrag)
            .commit();
    }

    public void showGame() {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        if (mGameFrag.isDetached()) {
            ft.attach(mGameFrag);
        }
        ft.hide(mListFrag).show(mGameFrag).commit();
    }
}

观察到MyGameFragment.onCreateView在首次连接之前未被调用。之后,隐藏和显示片段允许用户立即切换。

编辑:我意识到你现在想要用自己的按钮进行2项活动。我已经更新了代码以反映这一点。从OnClickListeners只需调用相关的活动函数,如下所示:

((MyActivity) MyListFragment.this.getActivity()).showGame();