Activity-Class-Methode in BroadcastReceiver-Class aufrufen

L

Lillitopf

Neues Mitglied
0
Hallo,

Ich bin noch ziemlich neu im Android programmieren uns steh grad voll an, evtl. könnt ihr mir hier helfen.

Folgender Code um es zu verdeutlichen:

Ich will also die Methode ControlAcitivity.startStopSauna() von BroadcastReceiver aus ausführen als wäre BroadcastReceiver der User und würde den Button in der ControlActivity drücken.

ControlActivity.class
Code:
public class ControlActivity extends Fragment {

        private static View rootView;
        public static Boolean BUTTON_SAUNA = false;

	public void startStopSauna() {
		if (!BUTTON_SAUNA) {
			BUTTON_SAUNA = true;
			setButtonStatus("button_sauna", true);
		} else {
			BUTTON_SAUNA = false;
			setButtonStatus("button_sauna", false);
		}
	}

	private void setButtonStatus(String button, Boolean buttonStatus) {
		if (buttonStatus == null) getControlPreferences();

		if (BUTTON_SAUNA) {
			((ImageView) rootView.findViewById(R.id.btn_sauna_led)).setImageResource(R.drawable.btn_led_on);
			((TextView) rootView.findViewById(R.id.tv_sauna_title)).setText(getString(R.string.btn_sauna_title_h1_2));
			showWellnessButtons();
		} else {
			((ImageView) rootView.findViewById(R.id.btn_sauna_led)).setImageResource(R.drawable.btn_led_off);
			((TextView) rootView.findViewById(R.id.tv_sauna_title)).setText(getString(R.string.btn_sauna_title_h1_1));
			hideWellnessButtons();
		}

		if (buttonStatus != null) setControlPreferences(button, buttonStatus);
	}
}

TextMessageReceiver.class
Code:
public class TextMessageReceiver extends BroadcastReceiver {

	public void onReceive(Context context, Intent intent) {
			Bundle bundle=intent.getExtras();

		...

		if (message.toString().equals("Saunaein")) {
			ControlActivity.startStopSauna(); // fehler da nicht static
		}

		...

	}
}

Meine frage daher. Muss ich somit alle Methoden die von startStopSauna() aus aufgerufen werden, public static definieren oder gibt es einen vernünftigeren Weg?

Vielen Dank schon mal fürs Kopfzerbrechen :confused2:
 
Nein, eigentlich braucht man dort nie statische Methoden.

Du solltest den BroadcastReceiver nicht im Manifest deklarieren, sondern als eine innere Klasse in der Activity implementieren.
Wenn man auf Intents, die von der App ausgelöst werden, hört, sollte man dies sowieso vermeiden. Die alte Konstruktion des BroadcastReciever ist eine der größten Sicherheitslücken in Android!!!!!!

Deshalb gibt es seit längeren den LocalBroadcastManager.

LocalBroadcastManager | Android Developers

Java Android Program to Demonstrate Local BroadCast Manager | Sanfoundry

https://gist.github.com/Antarix/8131277


Statische Klassen sollte man eigentlich vermeiden, dadurch wird der Programmcode fast immer unübersichtlich, und instabiler.
 
Vielen Dank markus.tullius.

Also mit dem BroadcastReceiver empfange ich SMS von nur einer speziellen Nr. Kommt von dieser Nr. eine SMS mit einen Bestimmten Text möchte ich Methoden von einer Activity aufrufen können.

Der BroadcastReceiver muss natürlich vor der Standard SMS-APP greifen.

Daher auch in der Manifest.xml

Code:
<!-- SMS Receiver -->
<receiver android:name=".TextMessageReceiver" android:exported="true">
    <intent-filter android:priority="1000">
      <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  </intent-filter>
</receiver>

Kann ich das auch mit dem LocalBroadcastManager?

Vielen Dank
 
Nein, das geht nicht mit ein LocalBroadcastManger. Intent von anderen App (insbesondere von Systemapps) braucht man einen Broadcastreceiver.

Aber du muss den Receiver trotzdem nicht im Manifest anmelden. Mit registerReceiver(BroadCastReceiver, IntentFilter) geht es auch im Quellcode.
Context | Android Developers

Abmelden mit unregisterReceiver(BroadcastReceiver).

Du solltest aber den Intent im BroadcastReceiver vorsichtig umgehen, insbesondere wenn man Extra - Werte, die dem Intent mit gegeben wurde, auswertet. Denn jede App kann solche Schnittstelle mit einen Intent ansprechen.

Siehe auch:
https://www.defcon.org/images/defcon...ooking-For.pdf
 
Die Frage ist warum die du die Methode der Activity aufrufen willst?

Die Activity läuft doch gar nicht zwingend zu der Zeit wo du was aufrufen willst.
Ich sehe den sinn auch gerade nicht.

Du solltest eher deine ControlPreferences setzen.
Du kannst die setButtonStatus Methode z.B. gar nicht aufrufen, weil die auf Views zugreift, die zu dem Zeitpunkt ja nicht mal existieren wenn die Activity nicht läuft.
 

Ähnliche Themen

Helmut1A
  • Helmut1A
Antworten
7
Aufrufe
1.128
Helmut1A
Helmut1A
M
  • maksimilian
Antworten
15
Aufrufe
1.704
maksimilian
M
Horstmann365
Antworten
1
Aufrufe
1.060
jogimuc
J
Zurück
Oben Unten