アプリケーションの画面の向きに問題があります。res/layout-lan フォルダーにランドスケープ モード用の別のレイアウトを作成しました。向きの変更中に問題が発生しました。
1.古いアクティビティを破棄せずにアクティビティが再作成されます。
2.アプリでメディアプレーヤーを使用しているため、画面の回転時に.mp3が両方の向きで同時に再生されます..
アクティビティの状態を保存および復元して画面の向きを処理するための適切なサンプル コードを見つけることができません........
アプリケーションの画面の向きに問題があります。res/layout-lan フォルダーにランドスケープ モード用の別のレイアウトを作成しました。向きの変更中に問題が発生しました。
1.古いアクティビティを破棄せずにアクティビティが再作成されます。
2.アプリでメディアプレーヤーを使用しているため、画面の回転時に.mp3が両方の向きで同時に再生されます..
アクティビティの状態を保存および復元して画面の向きを処理するための適切なサンプル コードを見つけることができません........
1.古いアクティビティを破棄せずにアクティビティが再作成されます。
の再作成はActivity
、構成の変更が発生したときの Android の既定の動作です。古いアクティビティがメモリに残る理由として考えられるのは、現在再生中の のインスタンスを参照しているためMediaPlayer
です。
横向きと縦向きで異なるレイアウト リソースを使用しているため、Android でアクティビティを再作成し、毎回適切なリソースを取得できるようにすることをお勧めします。ローテーションを自分で処理する場合は、適切なレイアウトを再読み込みする必要があります。
2.アプリでメディアプレーヤーを使用しているため、画面の回転時に.mp3が両方の向きで同時に再生されます..
この問題には2つの解決策があります...
理想的な解決策は、メディアの再生をService
. はActivity
を呼び出しService
て開始/停止などを行うことができます。ユーザーが指示したときに再生しますが、これを のようなバックグラウンド コンポーネントに入れると、変更によって流動的Service
な場合でも継続的に動作することができます。Activity
これは、Android チームが推奨するデザイン パターンであり、Activity
実際にはユーザー インターフェースのみを扱います。
別の実行可能な解決策は、を使用MediaPlayer
して古いActivity
ものから新しいものに渡すことonRetainNonConfigurationInstance()
です。これにより、インスタンス間でシングルMediaPlayer
が存在しActivity
、再生の一貫性が保たれます。例えば:
public class MyActivity extends Activity {
private MediaPlayer mPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Check if we have a player passed in from the last instance
mPlayer = (MediaPlayer)getLastNonConfigurationInstance();
//If not, make a new one
if (mPlayer == null) {
mPlayer = new MediaPlayer();
//...Set up new player instance...
}
}
@Override
public Object onRetainNonConfigurationInstance() {
//Clear our member variable to guarantee this Activity
// is allowed to GC after onDestroy()
MediaPlayer instance = mPlayer;
mPlayer = null;
//Hand our current player up to the next Activity to be created
return instance;
}
}
最良のメモリ クリーンアップを確実にする別のオプションは、 を として定義mPlayer
して、構成変更時に がオーディオを再生している場合でもWeakReference<MediaPlayer>
、GC が古い を要求できるようにすることです。Activity
MediaPlayer
以下の手順で画面の向きが変わったときに、アクティビティの再現を停止できます。
configChangesタグを次のように設定します
<activity android:name=".Activity_name"
android:configChanges="orientation|keyboardHidden">
以下の方法を使用してください。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// to do on orientation changed
}
}
v
フォルダres/layout-land を作成
res/layout - lanの代わりに <---- ここにdをフォルダー名に入れる