3

私はOpenGLを使用し、バックグラウンドミュージックを備えたゲーム(一種)を開発しています。アプリケーションはランドスケープモードでのみ実行されます。

私が抱えている問題は、ユーザーが画面をロックしたときに発生します。その時点onStop()で、画面の向きが変更され、向きの変更の結果としてアクティビティが再開された直後に呼び出されます。これは、OpenGLサーフェスが再作成され、音楽の再生が再開されることを意味します。ロック画面はCPUを集中的に使用する操作を開始するのではなく中断する必要があるため、これは直感に反します。

android:configChanges="orientation"マニフェストに追加しても何も起こりませんでした。私はおそらく欠落screenSizeしていることを認識しandroid:configChangesていますが、このオプションが利用できない以前のAPIバージョンをターゲットにしているため、追加できません。

だから、質問は:これを処理する適切な方法は何ですか?すべてが期待どおりに機能するように、どのイベントでアプリケーションを初期化する必要がありますか?

4

6 に答える 6

5

マニフェストのconfigChangesにscreenSizeを追加しても、プログラムが古いバージョンで実行されないという意味ではありません。targetSdkVersionをより高いバージョンに設定し、minSdkVersionを好きなように設定する必要があります。intelljIDEAでは、プロジェクト構造でModuleSKDを4に設定して、screenSizeが無効として強調表示されないようにしました。Eclipseでも同様である必要があります。

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />

<activity android:name=".MyActivity"
      android:label="@string/app_name"
      android:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation">

また、次のようなコードでバージョンを確認できます。

if (Build.VERSION.SDK_INT >= 11) 

このようにして、アプリは2.2以降のバージョンで動作します。

ゲームはおそらくランドスケープモードでのみ実行されるため、onConfigurationChangedは必要ないと思いますが、興味がある場合は、私の質問と私自身の回答に非常によく似ています。

向きの変更時にレイアウトを置き換える

于 2012-12-28T14:26:40.613 に答える
2

タグを追加します

"android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout"Manifest.xmlでのアクティビティについては、

そして、メソッドをオーバーライドします

public void onConfigurationChanged(Configuration newConfig) {}
于 2012-12-26T12:50:12.927 に答える
1

電話がロックされると、アクティビティが一時停止または停止するという事実を受け入れる必要があると思います。これは、それらのいくつかをやり直す必要があることを意味します。これは、OpenGLでAndroidゲーム開発の本を読んだ後に私が理解したことでもあります。

あなたができることは、@421が提案したことよりも少し多いです。これらのonSaveInstanceStateとonRestoreInstanceStateには、曲の一部と、何かをリロードする必要がある場合でもゲームを「スムーズに」再開できるようにするその他のデータを保存できます。

これまでに他の答えが見つからなかった場合は、これが理由である可能性があります。電話がロックされると、ゲームが奇妙なことをすることに多くの迷惑をかけました。手動で正しくスムーズに処理する必要があります。

于 2012-12-31T14:59:18.583 に答える
1

ゲームがランドスケープモード専用の場合は、タグandroid:screenOrientation="landscape"にプロパティを設定してみてください。activity

于 2012-12-26T13:12:05.217 に答える
1
        @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
}

上記は、アクティビティの方向が変更されたときに状態を保存するためのアクティビティの2つのメソッドです。データは、キーと値のペアの形式でバンドルオブジェクトに保存されます。

Androidmanifest.xmlファイルにタグを追加する必要はありません。上記のコードの場合。

android:screenOrientation="landscape"このタグを使用して、アクティビティをランドスケープモードでのみ実行することができます。このタグは、Androidmanifest.xmlに存在するアクティビティタグに追加する必要があります。

于 2012-12-31T11:30:28.310 に答える
1

あなたの正確なケースでは、私はこれを使用することを好みます:

@Override
protected void onCreate(final Bundle savedInstance) {
    super.onCreate(savedInstance);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

すべての場合に機能し、アクティビティを風景のみにする必要があります。

于 2012-12-31T12:09:28.910 に答える