1

アプリケーションの画面の向きに問題があります。res/layout-lan フォルダーにランドスケープ モード用の別のレイアウトを作成しました。向きの変更中に問題が発生しました。

1.古いアクティビティを破棄せずにアクティビティが再作成されます。

2.アプリでメディアプレーヤーを使用しているため、画面の回転時に.mp3が両方の向きで同時に再生されます..

アクティビティの状態を保存および復元して画面の向きを処理するための適切なサンプル コードを見つけることができません........

4

4 に答える 4

3

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 が古い を要求できるようにすることです。ActivityMediaPlayer

于 2012-07-11T18:46:49.647 に答える
0

以下の手順で画面の向きが変わったときに、アクティビティの再現を停止できます。

configChangesタグを次のように設定します

 <activity android:name=".Activity_name"
          android:configChanges="orientation|keyboardHidden">

以下の方法を使用してください。

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
   // to do on orientation changed          
    }
    }
于 2012-07-11T18:22:12.613 に答える
0
                       v 

フォルダres/layout-land を作成

res/layout - lanの代わりに <---- ここにdをフォルダー名に入れる

于 2012-07-11T18:35:52.820 に答える