2017-08-02 1 views
0

Unten ist das Beispiel meiner Parcelable-Klasse. Wie Sie sehen können, möchte ich Aktivität in eine Parcel setzen, aber wie könnte ich das tun? Ich schaue in den Quellcode von Activity, es ist nicht Parcelable noch Serializable.Ist es möglich, Aktivität in das Paket zu legen?

public class MyParcelable implements Parcelable { 
    private Activity mActivity; 
    private int mData; 
    private String mName; 

    @Override 
    public void writeToParcel(Parcel out, int flags) { 
     //out.writeX(mActivity); 
     out.writeInt(mData); 
     out.writeString(mName); 
    } 

    private MyParcelable(Parcel in) { 
     //mActivity = in.readX(); 
     mData = in.readInt(); 
     mName = in.readString(); 
    } 

    public MyParcelable(Activity activity, int data, String name) { 
     mActivity = activity; 
     mData = data; 
     mName = name; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    public static final Parcelable.Creator<MyParcelable> CREATOR 
      = new Parcelable.Creator<MyParcelable>() { 

     @Override 
     public MyParcelable createFromParcel(Parcel in) { 
      return new MyParcelable(in); 
     } 

     @Override 
     public MyParcelable[] newArray(int size) { 
      return new MyParcelable[size]; 
     } 
    }; 
} 
+1

Was ist nötig, um 'Aktivität' in Parzellen zu setzen? –

+3

Nein, es macht auch nicht viel Sinn – Selvin

+1

Was Sie wahrscheinlich tun möchten, ist die Aktivitätsklasse zu senden, können Sie ihren Namen als String senden. Eine Aktivität selbst ist nicht "nur eine Klasse", sie ist Teil eines größeren Systems zur Anzeige von Inhalten auf dem Bildschirm und enthält selbst nicht alles, was Sie selbst rekonstruieren müssen. – etan

Antwort

0

Sie können setzen alles in Paket- und nehmen etwas aus Parcel. Aber ob dieses "irgendetwas" danach funktioniert, hängt von einer Vielzahl von Faktoren ab.

Alle Activity-Instanzen bestehen in enger Zusammenarbeit mit dem ActivityManager von Android. Die meisten Methoden, die Aktivität definieren, delegieren an Methoden von ActivityManager, ViewManager, PackageManager und anderen Systemdiensten. Diese Methoden funktionieren nicht, nachdem die Aktivität vom System zerstört wurde. Diese Methoden funktionieren auch nicht, wenn Sie die Aktivitätsklasse ohne Androids "spezielle Soße" instanziieren. Obwohl es technisch möglich ist, eine Aktivitätsklasse mithilfe von Reflektion oder JNI zu instanziieren, funktionieren diese einfachen Instanzen nicht.

Dies ist, was die Leute meinen, wenn sie sagen, dass Aktivität "von Android verwaltet wird": Es wird im Wesentlichen von Betriebssystemprozessen angetrieben und kann nicht ohne Kommunikation mit diesen Prozessen existieren. Glücklicherweise hat Android eine Möglichkeit, eine solche Kommunikation zu initiieren: ein Intent. Ersetzen Sie diese Zeile:

private Activity mActivity; 

mit

private Intent mActivity; 

und verwenden Sie die Pakete aufgeteilt Intent die Aktivität zu starten, sobald Sie es auf der anderen Seite erhalten. Natürlich, wenn Sie mehr als nur Absicht benötigen, um Ihre Aktivität in brauchbare Form zu bringen, müssen Sie diese Dinge zusammen mit Intent in Ihrem Parcelable speichern.

0

Dies ist keine gute Idee, um Aktivität auf Parzelle zu setzen. Wenn Sie dies tun müssen, ist Ihr Code wahrscheinlich schlecht und Sie müssen den Code überprüfen, um diese Implementierung zu vermeiden.

Verwandte Themen