关闭和重新打开安卓应用程序

3
我正在制作一款安卓应用,包括主菜单和游戏活动两个活动。目前应用程序运行良好,而且在两个活动之间切换也正常工作。但是,当游戏活动正在运行时我按下了Home键,再次打开游戏时就会出现黑屏并且没有任何反应。我已经创建了所有的生命周期方法并且每次调用时都打印信息,但是当我尝试重新打开应用程序时,它不会调用主菜单或游戏活动的onCreate()、onStart()或onResume()方法。如果我到任务管理器中关闭应用程序,然后再重新打开它,它会像预期的那样打开到主菜单活动。问题只会在我按下Home键然后再次打开应用程序时出现。有没有办法解决这个问题?
以下是我的游戏活动的一些代码,包括所有的生命周期方法:
public class Klondike extends Activity{

private KlondikeGameView gameView;
private StatsHandler statsHandler;
private KlondikeGameStats gameStats;
private RelativeLayout mainLayout;
public boolean createSavedGame;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    createSavedGame = true;
    setContentView(R.layout.klondike);
    mainLayout = (RelativeLayout) findViewById(R.id.main_klondike_layout);
    DisplayMetrics dm = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics(dm);

    this.statsHandler = new StatsHandler();
    this.gameStats = new KlondikeGameStats(System.currentTimeMillis());

    gameView = new KlondikeGameView(getApplicationContext(), this, dm.heightPixels, dm.widthPixels, statsHandler, gameStats);
    mainLayout.addView(gameView);
    gameView.startGameThread();
}

@Override
protected void onStart() {
    super.onStart();
    System.out.println("OnStart was called for Klondike");
}

@Override
protected void onResume() {
    super.onResume();
    System.out.println("OnResume was called for Klondike");
    if (KlondikeSaveHandler.checkIfSavedStateExists(getApplicationContext())){
        KlondikeSaveHandler.restoreSavedState(getApplicationContext(), gameStats, gameView.getGameBoard());
    }
}

@Override
protected void onPause() {
    super.onPause();
    System.out.println("OnPause was called for Klondike");
    if (createSavedGame){
        KlondikeSaveHandler.prepareSavedGame(getApplicationContext(), gameStats, gameView.getGameBoard());
        System.out.println("Game saved");
    }
    else {
        System.out.println("Game not eligible for saving");
    }
}

@Override
protected void onStop() {
    super.onStop();
    System.out.println("OnStop was called for Klondike");
}

@Override
protected void onRestart() {
    super.onRestart();
    System.out.println("OnRestart was called for Klondike");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    System.out.println("OnDestroy was called for Klondike");
}
}

在我按下主页按钮后,onPause被调用,游戏得到了正确的保存。

这是清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.app.thomas.solitaire" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.app.thomas.solitaire.MainMenu"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.app.thomas.solitaire.Klondike"
            android:label="Klondike"
            android:theme="@style/AppTheme">
        </activity>
    </application>

</manifest>

你是否检查过当你按下Home键时会调用哪些生命周期方法 - 比如onPause、onStop和可能的onDestroy?如果你找出了活动被放入何种状态一旦你按下Home键,它可能会让你了解为什么这些生命周期方法可能没有被调用。此外,提供一些来自你游戏活动的代码以便了解活动的一般流程将会很有帮助。 - Elli White
是的,我有。当我按下主页按钮时,只会调用onPause方法。 - Thomas
你能发布你的清单文件吗? - Aritra Roy
在展示的每个活动中,当您按下主页按钮时,将调用onPause()方法,并且当您再次恢复应用程序时,将调用onResume()方法。这是Android应用程序生命周期的本质。如果您遇到黑屏问题,则可能在自定义视图“KlondikeGameView”中缺少某些内容。 - Arman Safikhani
好的,我已经发布了清单文件。@Arman 我尝试在onResume()中创建KlondikeGameView,但结果仍然是一片黑屏。然而,当我恢复应用程序时,它并没有打印出onResume()被调用的信息。当我按下主页按钮时,会调用onPause(),但再次打开应用程序时,onResume()从未被调用。我错过了什么吗? - Thomas
1个回答

0

尝试放置

gameView = new KlondikeGameView(getApplicationContext(), this, dm.heightPixels, dm.widthPixels, statsHandler, gameStats);
mainLayout.addView(gameView);
gameView.startGameThread();

在onResume()中而不是在onCreate()中


我把它移到了onResume()方法中,但结果仍然是一样的,只有一个黑屏。 - Thomas
你的onResume()方法不可能不被调用。来吧,逻辑思考一下(你可能遇到了问题,我相信)。尝试注释掉除onCreate()以外的所有方法中的代码和这些方法中的Log语句。如果仍然无法工作,请注释掉setContentView之外的onCreate()。我知道这听起来很傻,但它非常有效,一旦你开始得到这些日志语句,你就会知道代码出了什么问题。 - Mayank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接