BroadcastReceiver deaktivieren?

  • Antworten:7
Fabian
  • Forum-Beiträge: 144

05.10.2013, 19:28:31 via Website

Hey liebe Community,

ich bins mal wieder mit einer weiteren Frage.
Ich habe eine App geschrieben, welche bei einer ankommenden SMS eine Toast Nachricht auf dem Bildschirm ausgibt.
Soweit so gut, nun möchte ich aber, dass der Nutzer mit Hilfe einer CheckBox diesen BroadcastReceiver ein bzw. ausschalten kann.
Wie deaktiviere ich einen Receiver, etwa in der Manifest?

Für jede Hilfe dankbar!

grüße Fabian!

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

05.10.2013, 19:40:21 via Website

Im Manifest geht das zwar, aber wie soll der User das dann an/aus setzen können ? Was du brauchst ist eine "Codeweiche", wenn der User die Checkbox gesetzt hast schreibst du das in die SharedPreferences und prüfst das im Receiver einfach ab.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Fabian
  • Forum-Beiträge: 144

06.10.2013, 17:27:13 via Website

Hey Mac Systems,

habe deinen Vorschlag nun ausprobiert und trotz des Hakens und Abruf einer static Variable im Receiver springt der Broadcast nicht an.
1public void onCheckBoxClicked(View view) {
2 boolean checked = ((CheckBox) view).isChecked();
3 switch (view.getId()) {
4 case R.id.isActiv:
5 if (checked) {
6 SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
7 SharedPreferences.Editor editor = sharedPreferences.edit();
8 editor.putBoolean(NameOfFile, true);
9 editor.commit();
10 StatusForReceiver = getStatusForReceiver();
11 } else if (!checked) {
12 SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
13 SharedPreferences.Editor editor = sharedPreferences.edit();
14 editor.putBoolean(NameOfFile, false);
15 editor.commit();
16 StatusForReceiver = getStatusForReceiver();
17
18 }
19 }
20 }

im Receiver frag ich dann:
1@Override
2 public void onReceive(Context context, Intent intent) {
3 if (MainActivity.StatusForReceiver) {
4 TelephonyManager telephonyManager = (TelephonyManager) context
5 .getSystemService(Context.TELEPHONY_SERVICE);
6 MyPhoneStateListener PhoneListener = new MyPhoneStateListener(
7 context, this);
8 telephonyManager.listen(PhoneListener,
9 PhoneStateListener.LISTEN_CALL_STATE);
10 }
11 }

StatusForReceiver ist eine static Variable, welche ich in der OnCreate und nach jedem drücken auf die CheckBox initialisiere, was mache ich nun wieder falsch?

grüße Fabian!

Antworten
impjor
  • Forum-Beiträge: 1.793

06.10.2013, 18:30:30 via App

1. Bei nur einem case, würde ich das switch durch ein if ersetzen!
2. Da checked ein boolean ist, reicht if(checked) {
...} else {
....}
ohne zweites else if
2b: Edit: Da bei beiden Fällen (fast) das selbe passiert, würde ich dir raten das ganze if (checked)-Konstruckt durch #putBoolean(nameOfFile, checked); zu ersetzen!

3. Variabelnamen immer camelCase: statusForReceiver
4. Lösch alles mit statusForReceiver und frage in deinem Broadcastreceiver die SharedPreferences ab!

LG

— geändert am 06.10.2013, 18:35:12

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Fabian

Antworten
Fabian
  • Forum-Beiträge: 144

06.10.2013, 20:24:23 via Website

Hey impjor,

erst einmal vielen Dank für deine Hilfe. Trotzdem klappt es leider nicht. Hier der neue Code:
onCreate: Auch hier frage ich noch einmal die Preferences ab, damit beim start der App das Häckchen auch korrekt angezeigt wird.
1@Override
2 protected void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.activity_main);
5 checkBox = (CheckBox) findViewById(R.id.isActiv);
6 sharedPreferences = getPreferences(MODE_PRIVATE);
7 boolean checked = sharedPreferences.getBoolean("test", true);
8 checkBox.setChecked(checked);
9 checkFlashLightAvailable();
10 }

onCheckBoxClicked:
1public void onCheckBoxClicked(View view) {
2 boolean checked = ((CheckBox) view).isChecked();
3 SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
4 SharedPreferences.Editor editor = sharedPreferences.edit();
5 editor.putBoolean("test", checked);
6 editor.commit();
7 }

Hier mal der Broadcast, wo ich das ganze abrufe:
1public class CallReceiver extends BroadcastReceiver {
2 SharedPreferences sharedPreferences;
3
4 @Override
5 public void onReceive(Context context, Intent intent) {
6 if(getStatusForReceiver(context)){
7 TelephonyManager telephonyManager = (TelephonyManager) context
8 .getSystemService(Context.TELEPHONY_SERVICE);
9 MyPhoneStateListener PhoneListener = new MyPhoneStateListener(
10 context, this);
11 telephonyManager.listen(PhoneListener,
12 PhoneStateListener.LISTEN_CALL_STATE);
13 }
14 }
15
16 public boolean getStatusForReceiver(Context context) {
17 sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
18 return sharedPreferences.getBoolean("test", false);
19
20 }
21}

Nehme ich die Preferences raus klappt alles wunderbar.

grüße Fabian!

Antworten
impjor
  • Forum-Beiträge: 1.793

06.10.2013, 20:43:52 via Website

Fabian

1sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
2 return sharedPreferences.getBoolean("test", false);

Ich würde auch hier
1sharedPref = context.getSharedPreferences(MODE_PRIVATE, "flashlight");
nehmen.

entsprechend alle getPreferences(...) durch getSharedPreferences(MODE_PRIVATE, "flashlight"); ersetzen!

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Fabian

Antworten
Fabian
  • Forum-Beiträge: 144

06.10.2013, 20:57:01 via Website

So in etwa:

1@Override
2 public void onReceive(Context context, Intent intent) {
3 sharedPreferences = context.getSharedPreferences(MainActivity.File, Context.MODE_PRIVATE);
4 boolean checked = sharedPreferences.getBoolean(MainActivity.File, true);
5 if (checked) {
6 TelephonyManager telephonyManager = (TelephonyManager) context
7 .getSystemService(Context.TELEPHONY_SERVICE);
8 MyPhoneStateListener PhoneListener = new MyPhoneStateListener(
9 context, this);
10 telephonyManager.listen(PhoneListener,
11 PhoneStateListener.LISTEN_CALL_STATE);
12 }
13 }

Klappt leider auch nicht.

Das komische ist ja aber, wenn ich das Häckchen setze und die App komplett schließe und sie wieder öffne, ist das Häckchen wieder gesetzt und beim nichtsetzen genauso. Das bedeutet ja, dass die App sich den Boolean holt. Nur in der Receiver Klasse scheint sie sich den Boolean nicht holen zu können und setzt dann ein true, weils nicht gefunden wurde.

edit: Jetzt klappts, ich habe vergessen
1sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
auch in der onCreate zu setzen, weil er sich ja sonnst am Anfang das falsche Objekt holen würde.
Vielen Dank Dir! :D

grüße Fabian!

— geändert am 06.10.2013, 21:00:45

Antworten