0

私はAndroid用の音楽プレーヤーを作成していますが、ほとんど機能しています。問題は、デバイスを水平に回転させると、アクティビティからすべての変数が失われることです(これは、破棄されて再作成されるため、理にかなっています)。

バンドルを使用してonSaveInstanceStateとonRestoreInstanceStateでプレーヤーの状態を保存しようとしましたが、それでもメディアプレーヤーにアクセスできません。MediaPlayerのようなオブジェクトをバンドルで渡す方法はありますか?代わりにデータベースを使用する必要がありますか?

ありがとう

4

4 に答える 4

4

「バックグラウンド」オーディオ再生機能を提供するサービスを使用して、ユーザーが再生を停止せずにアクティビティを切り替えたり、デバイスを回転したりできるようにする必要があります。

githubのCMによってオープンソースであるandroid_packages_apps_Musicをチェックアウトします。これを行うには、MediaPlaybackService extendsServiceを使用します。MediaPlaybackService.javaをチェックアウトします。

于 2012-04-06T17:16:33.423 に答える
1

バンドルを介して渡すことができなかったオブジェクトについては、単純なSharedPreferenceを使用してオブジェクトを格納することをお勧めします。ここに簡単な実装があります:

public class Data {
     private SharedPreferences preferences; 
     private int test; 

     public Data (Context context)
     {          
        preferences = context.getSharedPreferences("Data", 0);
        test = preferences.getInt("test", 0);
     }

     public int getTest()
     {       
             return test;
     }

     public void setTest(int input)
     {       
        this.test = input;
        SharedPreferences.Editor editor = preferences.edit();
        editor.putInt("Test", input);
        editor.commit();
     }    
}

onCreate()で変数を初期化する必要があります。

データmydata=new Data(this);

また、mydataでset / getを使用して、永続データを保存/取得できます。

編集:MediaPlayerオブジェクトには適していないかもしれませんが、他の古典的なタイプ(int、string、boolean ...)には適していません。

于 2012-04-06T16:43:44.810 に答える
1

以下の両方の方法で、ローテーションを通じてメディアプレーヤーオブジェクトを保持できますが、どちらもバンドルを使用しません。

  • onRetainNonConfigurationInstance()を使用して変数を保存し、ローテーション後に取得することでメディアプレーヤーを永続化できますgetLastNonConfigurationInstance()が、このメソッドは常に呼び出されるとは限らないため、必ずしも最適ではありません。

    -詳細については、このSO投稿を参照してくださいhttps://stackoverflow.com/a/3916068/655822

  • または、アプリケーションクラスを拡張してそこに保存することで、メディアプレーヤーを永続化することもできます。

    この回答をより読みやすくするために、リンクされたSO回答からコピーされた以下の情報

    頻繁に使用される場合は、グローバルシングルトンでデータを渡すことができます。

    public class YourApplication extends Application 
    {     
         public SomeDataClass data = new SomeDataClass();
    }
    

    次に、次の方法で任意のアクティビティで呼び出します。

    YourApplication appState = ((YourApplication)this.getApplication());
    appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.
    

    -そのhttps://stackoverflow.com/a/4208947/655822の詳細については、このSO投稿を参照してください

于 2012-04-06T16:44:18.647 に答える
0

別の方法は次のようになります:

AndroidManifest.xmlで、アクティビティのエントリを見つけて、次の属性と値を追加します。

android:configChanges="orientation|screenSize"

これにより、オリエンテーションでアクティビティが破壊されて再作成されるのを防ぐことができます。

于 2012-04-06T17:18:35.683 に答える