Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何避免重新初始化需要很长时间初始化的活动_Android - Fatal编程技术网

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

Android 如何避免重新初始化需要很长时间初始化的活动,android,Android,我有一个应用程序,有两个屏幕和按钮,可以在它们之间切换。一个屏幕主要是一个列表视图,但另一个屏幕中有一个游戏引擎(AndEngine),游戏引擎在第一次创建活动时可能需要一段时间才能初始化。 因此,在使用新的游戏引擎时,在它们之间切换可能会导致较大的延迟。但是,如果我只使用后退按钮,上一个游戏引擎的加载速度要快得多。 有没有一种方法可以让我只指定一个游戏引擎,并始终显示该活动的实例?现在我正在使用startinent()交换屏幕。还有别的办法吗? 有一种方法可以让我只拥有每个活动的一个实例并在它

我有一个应用程序,有两个屏幕和按钮,可以在它们之间切换。一个屏幕主要是一个列表视图,但另一个屏幕中有一个游戏引擎(AndEngine),游戏引擎在第一次创建活动时可能需要一段时间才能初始化。 因此,在使用新的游戏引擎时,在它们之间切换可能会导致较大的延迟。但是,如果我只使用后退按钮,上一个游戏引擎的加载速度要快得多。 有没有一种方法可以让我只指定一个游戏引擎,并始终显示该活动的实例?现在我正在使用startinent()交换屏幕。还有别的办法吗?
有一种方法可以让我只拥有每个活动的一个实例并在它们之间进行交换?

Android提供了一种使用TabHost在活动之间切换的简单方法。您还可以使用它在片段之间切换,如下所述。或者,您可以向活动中添加框架布局,以编程方式实例化片段,并在需要时附加/显示/隐藏它们

您的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>
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,才会调用它。之后,隐藏和显示片段允许用户毫不延迟地切换

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


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

发动机是一个对象吗?如果是,保存并还原它,而不是初始化。引擎是一个视图。它扩展了“活动”。@Plastic:“但是,如果我只使用“后退”按钮…”在列表视图活动中调用
finish()
,将有效地执行与按“后退”按钮相同的操作。@MisterSquonk不会完成()完全做我不想做的事情吗?也就是说,它不会告诉android停止活动并对其进行垃圾收集吗?我想要的是一种在活动之间切换的方法,而无需startinent()创建活动的新实例。@Plastic:您的措辞建议在“列表视图”活动中使用“后退”按钮,这样您可以更快地返回“游戏引擎”活动。您的问题的措辞还表明,如果您从“游戏引擎”活动转到“列表视图”活动,然后想要返回,则您正在使用意图来启动“游戏引擎”活动的新实例。但是,使用
finish()
与在“列表视图”活动中使用“后退”按钮相同,只需结束“列表视图”活动并返回“游戏引擎”,而无需创建新引擎。我还发现了另一种解决方案:使用安卓:launchMode=“singleInstance”在manifest.xml中,也使屏幕像单例一样工作。仅创建了该活动的一个实例。但是这些标签实际上使它们保持打开状态,并且工作速度最快。所以我接受了这个答案。singleInstance做了一些有趣的事情,试着启动你的应用程序,然后用home按钮将其设置为背景。这样做几次,然后试着按下后退按钮返回您来自的位置。