2012-04-06 5 views
0

Ich erstelle einen Musik-Player für Android und es funktioniert meistens. Das Problem ist, dass wenn ich das Gerät horizontal drehe, verliere ich alle Variablen von der Aktivität (was sinnvoll ist, weil es zerstört und neu erstellt wird).Verlieren 'MediaPlayer' (und andere Variablen) wenn Gerät gedreht wird

Ich habe versucht, Bundles zu verwenden, um den Status des Players mit onSaveInstanceState & onRestoreInstanceState zu speichern, aber ich kann immer noch nicht auf den Media Player zugreifen. Gibt es eine Möglichkeit, Objekte wie den MediaPlayer in Bündeln zu übergeben? Sollte ich stattdessen eine Datenbank verwenden?

Dank

Antwort

4

Sie ein verwenden sollten Service zu bietet "Hintergrund" Audio-Wiedergabe-Funktionen, allo winge den Benutzer, um zwischen Aktivitäten zu wechseln oder Gerät zu drehen, ohne die Wiedergabe zu stoppen.

Check out android_packages_apps_Music, die Open-Source auf Github von CM ist, verwenden Sie es MediaPlaybackService Dienst, dies zu tun erstreckt, Kasse MediaPlaybackService.java

1

Für Objekte, die Sie nicht über ein Bündel passieren könnte, würde ich vorschlagen, dass Sie die einfache SharedPreference verwenden, um Objekte zu speichern. Hier haben Sie eine einfache Implementierung:

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(); 
    }  
} 

Sie haben soeben haben die Variable in der onCreate() zu initialisieren:

Daten mydata = new Daten (this);

Und Sie können set/get mit mydata verwenden, um Ihre persistenten Daten zu speichern/abrufen.

Edit: Es ist vielleicht nicht geeignet für MediaPlayer Objekte, aber für andere klassische Typen (int, string, boolean ...).

1

Beide Methoden unten erlauben Ihnen, Ihr Mediaplayer-Objekt durch die Rotation zu halten, aber keine Bündel.

  • Sie könnten Ihren Media-Player bestehen onRetainNonConfigurationInstance() unter Verwendung der Variable und getLastNonConfigurationInstance() abzurufen es nach der Drehung, aber diese Methode ist nicht unbedingt die beste zu sparen, da es nicht immer

    -Siehe genannt wird diese so für mehr Informationen schreiben https://stackoverflow.com/a/3916068/655822

  • Oder Sie könnten Ihren Media-Player bestehen bleiben, indem Sie Ihre Anwendungsklasse erstreckt und es dort

    unter Speicherung Informationen, die aus der verknüpften SO-Antwort kopiert wurden, um diese Antwort schneller lesbar zu machen

    Sie können Daten in einem globalen Singleton übergeben, wenn es viel verwendet wird.

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

    Dann ist es durch eine Tätigkeit nennen:

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

    -Siehe dieses SO für weitere Informationen veröffentlichen an diesem https://stackoverflow.com/a/4208947/655822

+0

Jeder, der dies versucht, muss Folgendes hinzufügen: android: name = ". Klassenname" zum Manifest –

0

Eine andere Möglichkeit wäre:

In AndroidManifest.xml, finden Sie Ihr Eintrag für Ihre Aktivität und fügen Sie das folgende Attribut und Wert:

android:configChanges="orientation|screenSize" 

Dies wird Ihre Aktivität vor Zerstörung und neu auf Ausrichtung zu stoppen.

+0

Dies funktioniert, aber Sie müssen das Layout ersetzen, wenn Sie ein anderes Layout für Hoch- und Querformat verwenden. – draksia

+0

Ye, es ist nur das Problem zu vermeiden - es ist, was ich verwendet habe :) –

Verwandte Themen