Classe von einer Activity in eine andere weitergeben

  • Antworten:6
  • Bentwortet
Gelöschter Account
  • Forum-Beiträge: 3

10.02.2012, 15:52:21 via Website

Hallo Leute,

ich stehe vor dem Problem, dass ich eine Klasse in zwei Activitys verwenden möchte und keinen Weg finde, sie von der 1. in die 2. Activity weiter zu geben.

Im groben besteht mein Programm aus einem Menü (Activity 1), in dem die Instanz einer Bluetooth-Connect-Klasse erstellt wird und über diese eine Verbindung zu einem Gerät aufgebaut wird, sowie einer Chatoberfläche (Activity 2), von der aus Nachrichten über die Bluetooth-Connect-Klasse verschickt werden.

Ich habe mir bereits Parcelable Klassen angeschaut, allerdings ist meine Bluetooth-Connect-Klasse meiner Meinung nach zu komplex, da sie wieder verschiedene Objekte enthält, um sie so zu übergeben.

Ich würde mich wirklich sehr freuen wenn Ihr mir da weiterhelfen könnt.

Danke

Antworten
Florian B.
  • Forum-Beiträge: 284

10.02.2012, 16:52:46 via Website

Eine Möglichkeit wäre es deine Bluetooth-Connect-Klasse als Singleton zu implementieren, sodass du immer das gleiche Objekt zurück bekommst. Eine andere Möglichkeit wäre es, die ganze Funktionalität, die deine Bluetooth-Verbindung betrifft, in einen Service aus zulagern, der im Hintergrund läuft und den du über deine Activity-Klassen ansprechen kannst.

Gelöschter AccountAnsgar M

Antworten
Gelöschter Account
  • Forum-Beiträge: 281

10.02.2012, 21:45:33 via Website

Oder du könntest deine Bluetooth-Instanz in der Application halten...

Gelöschter Account

Antworten
Gelöschter Account
  • Forum-Beiträge: 3

10.02.2012, 22:59:04 via Website

@Florian:
Danke, beides gute Ideen. Ich werde die nächsten Tage mal schauen, welche besser funktioniert. Momentan gefällt mir die Singleton-Idee am besten.

@Thomas:
Danke für die Antwort, ich hab nur leider nicht verstanden was du mir damit sagen willst ;) Könntest du das genauer erklären?

Antworten
Florian B.
  • Forum-Beiträge: 284

11.02.2012, 11:34:02 via Website

Thomas M.
Oder du könntest deine Bluetooth-Instanz in der Application halten...

Du hast bei Android die Möglichkeit der App eine Application Klasse hinzu zu fügen. Diese muss von der Klasse Application abgeleitet sein und im Manifest eingetragen sein. Letztendlich ist das auch eine Art Singleton Klasse. Wenn du getApplication() aus den Acitivity Klassen aufrufst, dann wird dir immer das gleiche Application Objekt zurück gegeben.

Gelöschter Account

Antworten
Gelöschter Account
  • Forum-Beiträge: 3

15.02.2012, 11:32:04 via Website

Hab mich für Singleton entschieden.

Vielen Dank, ihr seid besser als jeder professionelle Support :D

— geändert am 15.02.2012, 11:32:22

Antworten
Philip M.
  • Forum-Beiträge: 90

15.02.2012, 12:40:46 via Website

Auch wenn dein Problem gelöst ist... wenn du ein Objekt von einer Activity zu einer anderen weitergeben willst, eignet sich hierfür auch dein Objekt mit "implements Parcelable" zu erweitern. Wie so etwas aussehen kann zeig ich dir mal hier:

1public class Profil implements Parcelable{
2
3
4 private String profilname;
5 private Rechnungsdaten rechnungsDaten;
6
7
8 public Profil() {
9
10 }
11
12
13 public Profil(String profilname, Rechnungsdaten rechnungsDaten) {
14 this.rechnungsDaten = rechnungsDaten;
15 this.profilname = profilname;
16 }
17
18
19 public Rechnungsdaten getRechnungsdaten() {
20 if(rechnungsDaten == null){
21 rechnungsDaten = new Rechnungsdaten();
22 }
23 return rechnungsDaten;
24 }
25
26
27 public void setRechnungsdaten(Rechnungsdaten adresse) {
28 this.rechnungsDaten = adresse;
29 }
30
31
32 public String getProfilname() {
33 return profilname;
34 }
35
36
37 public void setProfilname(String profilname) {
38 this.profilname = profilname;
39 }
40
41
42 // -----------------------
43 // Parcelable --------
44 // -----------------------
45
46
47 public static final Parcelable.Creator<Profil> CREATOR = new Parcelable.Creator<Profil>() {
48 @Override
49 public Profil createFromParcel(Parcel source) {
50 return new Profil(source);
51 }
52 @Override
53 public Profil[] newArray(int size) {
54 return new Profil[size];
55 }
56
57 };
58
59
60 private Profil(Parcel p) {
61 setProfilname(p.readString());
62 setRechnungsdaten((Rechnungsdaten)p.readParcelable(Rechnungsdaten.class.getClassLoader()));
63 }
64
65
66 @Override
67 public void writeToParcel(Parcel out, int flags) {
68 out.writeString(getProfilname());
69 out.writeParcelable(getRechnungsdaten(), flags);
70 }
71
72
73 @Override
74 public int describeContents() {
75 // TODO Auto-generated method stub
76 return 0;
77 }
78
79
80 public static final Parcelable.Creator<Profil> CREATOR = new Parcelable.Creator<Profil>() {
81
82 @Override
83 public Profil createFromParcel(Parcel source) {
84 return new Profil(source);
85 }
86
87 @Override
88 public Profil[] newArray(int size) {
89 return new Profil[size];
90 }
91
92 };
93
94
95 // -----------------------
96 // Parcelable End --
97 // -----------------------
98
99}



Hierbei ist allerdings zu beachten, dass die hier genannte "Rechnungsadresse" auch Parcelable implementieren muss und dortige, eventuelle Objekte welche kein primitiver Datentyp sind, auch dies in dieser Form implementieren müssen.

Das Objekt dann einer Activity weiter zu geben und in dieser aus zu lesen geht wie folgt:
1//(Pseudocode)
2
3// Du erstellst einen Intent
4Intent i = new Intent(context, Activity2.class);
5
6// Du fügst deinem Intent das zu übertragen gewünschte Objekt zu
7i.putExtra("profil", new Profil("TestProfil", new Rechnungsadresse("Irgendwelche Daten die hier hin gehören")));
8
9// Du startest ganz normal die Activity
10this.startActivity(i);
11
12// -----------------------------------------
13
14// In der nun gestarteten Activity kannst du das Pofil nun wie folgt abrufen
15Profil p = this.getIntent().getParcelableExtra("profil");

Das wäre die sauberste Methode und auch die Methode die ich dir empfehlen würde. Der Grund ist ganz einfach, da man Singletons so weit es geht vermeiden sollte (schon allein deswegen, da es nicht dem Sinn der OOP entspricht), weil diese zu schwer nachvollziehbaren Fehlern führen können und das Testen ungemein erschweren. Nutze Singleton also am Besten nur da, wo es wirklich nicht anders geht.

— geändert am 15.02.2012, 12:44:34

Gelöschter Account

Antworten