Konzeptanfrage - Intent - SharedPreferences

fLooojava

Bekanntes Mitglied
Servus Community,

ich entwickle derzeit ein App. Derzeit habe ich zwei Activities. Die MainActivity und die SettingsActivity. In der SettingsActivity kann der Benutzer einen String, in meiner Anwendung eine MAC, in einem Textfeld eingeben und anschließend mittels Button speichern.

In der MainActivity brauche ich diesen eingetippten String zur weiteren Verwendung. Ich habe nun zwei Varianten ausprobiert und möchte gerne wissen ob ich hier auf dem richtigen Weg bin.

Variante 1: Beim Start meiner App wird immer ein Toast angezeigt und die BluetoothAbfrage wird angezeigt. Wenn ich nun in meiner SettingsApp den String speichere ( als sharedPreference ) übergebe ich meiner MainActivity anhand eines Intents den String. Dies führt dazu, dass ich meine MainActivity erneut starte. Hier poppt dann wieder der Toast und die Bluetooth Abfrage auf, was nicht sinn der Sache ist. Deshalb komme ich nun zu Variante 2.

Variante 2: Da ich meinen String als sharedPreference mittels einem key speichere hole ich mir in der MainActivity so den String, und nicht mehr über einen Intent. Zumal ich bei einem Intent dann immer wieder zuerst die SettingsActivity aufrufen muss.

Im Code sieht das ganze folgendermaßen aus:

Variante 1 - Code aus der SettingsActivity:
Java:
 btnSaveMAC.setOnClickListener(new View.OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
			        String mac = mactxt.getText().toString();
			        textViewMAC.setText(mac);
			        saveMAC("mac", mac);
		            //Neues Intent anlegen
	                Intent mainScreen = new Intent(getApplicationContext(), MainActivity.class);
	                //Intent mit den Daten füllen
	                mainScreen.putExtra("macaddress", mac);
	                // Intent starten und zur zweiten Activity wechseln
	               startActivity(mainScreen);
	              
	                
				}
			});

Variante 2 - Code aus der SettingsActivity:

Java:
 btnSaveMAC.setOnClickListener(new View.OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
			        String mac = mactxt.getText().toString();
			        textViewMAC.setText(mac);
			        saveMAC("mac", mac);
                                finish();
	                
				}
			});

Die saveMAC Methode:
Java:
 public void saveMAC(String spString, String s){
		  
		   Editor editor = sharedpreferences.edit();
		   editor.putString(spString, s);
		   editor.commit();
		   
	   };


Variante 1 in der MainAcitivty um an den String zu kommen:

Java:
 BTMAC.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//receiving intents from the settingsactivity
Intent i = getIntent();
// Receiving the Data
String mac = i.getStringExtra("macaddress");
Log.w("myApp", mac);
textViewtest.setText(mac);
// Displaying Received data
}
});
Variante 2 in der MainActivity um an den String zu kommen:
Java:
BTMAC.setOnClickListener( new View.OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			SharedPreferences sharedpreferences;
			final String MyPREFERENCES = "MyPrefs" ;
	 	    sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
	 	    String mac = sharedpreferences.getString("mac", "");
		      textViewtest.setText(mac);
		      // Displaying Received data
		}
	});


Meine Frage nun: Variante 1 ist soweit ich nun erfahren habe nicht geeignet, aufjedenfall nicht so wie ich es gelöst habe, da ich hier die MainActivity starte und somit der "StartToast" wieder erscheint. Ist die Lösung mit der zweiten Variante ( finish(); und den String über sharedPreferences ) so üblich, oder werden solche Vorgänge komplett anderst gemacht? Den String muss ich sowieso abspeichern, da dieser nicht bei jedem Appstart eingegeben werden sollte, sondern nur bei einer Änderung des Geräts.


Bin für jede Anmerkung, für jeden Tipp für jede konstruktive Kritik dankbar! :rtfm:


flo
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Du kannst Daten zwischen Einzelnen Activitys einfach per intent und bundle übergeben, sprich Du kannst die Mac Adresse als String einfach von einer zur anderen Activity weiterreichen, ich Habs jetzt nur schnell überflogen, sonst schaue ich mir das morgen mal in Ruhe an, wenn dier das nicht weiter hilft.
 
Zuletzt bearbeitet:

fLooojava

Bekanntes Mitglied
hi kaoZ,

vielen Dank für deine Anwort. ;)

Dass die Datenübergabe in Android mittels Intents abläuft ist mir klar, jedoch "starte" ich bei meiner Übergabe dann immer wieder meine MainAcitvity - und dann wird auch wieder der Toast ausgeführt. Leider weiss ich nicht, wie ich dieses Problem lösen kann. Klar kann ich die SettingsActivity schließen - mit finish(); - nur wie komm ich dann zu meinem String?

Ich kann doch prinzipiell nur a) die SettingsActivity schließen (finish(); ) ( wie übergebe ich dann den String? ) , sodass meine MainActivity wieder in den Vordergrund kommt oder b) ich starte die MainActivity erneut mit einem Button, und übergebe somit dem Intent meinen String - jedoch dann das Problem mit dem Toast.

Würd mich aufjedenfall freuen wenn dus dir morgen mal in Ruhe ansiehst. :)

cheers flo
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Also, in normalen Desktop Anwendungen würde man hierzu Preferences oder Properties nutzen, bei Applikationsstart würde man dann einfach prüfen ob ein Wert gesetzt ist oder nicht, wenn notwendig einen default Wert setzen oder, wenn nicht speichert man diesen Wert in einem Properties oder Preferences Objekt, bei Properties müsste man
Beim beenden der Applikation diese dann noch in eine Datei schreiben, bei Preferences wird die registry des os genutzt, wie das Gegenstück unter Android aussieht müsste ich mir erst anschauen, wenn alle Stricke Reißen, würde ich einfach eine Datei anlegen (Serialisieren) beim Start prüfen ob diese den gewünschten Wert enthält, und falls nicht den Toast anzeigen.
 
Zuletzt bearbeitet:

fLooojava

Bekanntes Mitglied
Vielen Dank kaoZ für deine Erklärungen.

Danke pallidotcom, ich vermute genau dass ist es was ich gesucht habe :). (Y)

cheers flo
 

Neue Themen


Oben