Konzept meiner App

  • Hallo Community


    Weil ich auf meinem Galaxy S9 ein Prepaid-Surf-Abo gelöst habe und unterwegs gelegentlich vergesse, die Mobile Daten auszuschalten, was mein Surf-Konto plündert, möchte ich eine App schreiben, die mir genau dann eine Notification (oben links) anzeigt, wenn "Mobile Daten" eingeschaltet ist. Es ist mir als Anfänger gelungen, als Teillösung eine App zu schreiben, die beim Ausführen diese Notification anzeigt, wenn "Mobile Daten" eingeschaltet ist, bzw. löscht, wenn nur WLAN eingeschaltet ist. Aber ich scheitere daran, jetzt daraus eine selbständige App zu machen, die das Gewünschte liefert, auch weil ich bis jetzt in meinem Leben nur zwei Apps mit je einer einzigen Klasse geschrieben habe. Vielleicht kann mir aber der eine Profi eine oder mehrere der folgenden Fragen beantworten, die auch nicht in meinem Lehrbuch behandelt werden. Danke für jeden Tipp, insbesondere auch Hinweise, wo und wie ich mich zu diesen Themen schlau machen kann ...


    1) Vermute ich richtig, dass die beste Form für meine Idee ein Service wäre, der unsichtbar permanent im Hintergrund läuft? Wenn ja: Ich habe noch nie einen Service geschrieben, gibts irgend wo eine einfachere Anleitung/ein Beispiel?


    2) Kann meine App die Aktionen "Mobile Daten ein" bzw. "Mobile Daten aus" abfangen, so dass meine App entsprechend mit der Notification reagieren kann, oder muss meine App selber z.B. jede Sekunden testen, ob "Mobile Daten" ein- oder ausgeschaltet ist?


    3) Um jede Sekunde einen Code auszuführen, habe ich im Internet folgende Lösung gefunden. Aufruf der Klasse "Test" in der MainActivity OnCreate-Methode mittels

    Code
    Test test = new Test();

    Und hier die Klasse "Test" (erzeugt alle Sekunden einen Pieps):

    Das funktioniert, führt aber nach ca. 20 Repetitionen zu einem Absturz. Warum? Speicherproblem? Aus dem Logcat werde ich nicht klug:



    4) Der folgende Code für das Erzeugen/Löschen der Notification funktioniert, wenn ich ihn in der MainActivity in der onCreate-Methode schreibe. Wenn ich diesen Code aber in die obige Klasse "Test" anstelle des Pieps von Zeile 9/10 schreibe, erhalte ich Fehler:
    Zeile 1: getApplicationContext() cannot resolve method
    Zeile 3 und 19: getSystemService(this.NOTIFICATION_SERVICE) cannot resolve method
    Zeile 10: MainActivity.this not an enclosing class


    Auch da weiss ich leider nicht, wie ich das abändern muss, damit der Code in der Klasse "Test" anstelle des Pieps läuft.




    Danke an alle, die sich bis hierher durchgekämpft haben!

  • Hallo


    Zu Frage 1 ich würde sagen das da ein Broadcast Receiver besser geeignet ist.
    Das System versendet BroadcastIntenst die du mit einem Receiver abfangen kannst.
    Die Action “ACTION_AIRPLANE_MODE_CHANGED” könnte da nützlich sein.
    https://developer.android.com/guide/components/broadcasts
    https://www.big-app.de/broadcast-receiver-in-android/



    Frage 2 ist eigentlich mit frage 1 beantwortet. Direkt abfangen glaube nur über eine Callback Methode. Aber du bekommst ja eine Änderung der Airplane und somit des Netzwerks mit, über den Receiver und kannst dann selber prüfen.



    Frage 3 der Code ist bestimmt aus einen Beispiel für eine Desktop Anwendung nicht für Android denn in Android gibt es keine Main() Methode.
    Der Timer läuft im Main Thread .



    Frage 4
    Du bist in einer anderen Klasse die von Thread erbt und nicht von Activity.
    Du hast hier keinen Kontext der Activity .
    Den müsstest du den Konstruktor mitgeben Instanzieren der Klasse.
    Aber wie so willst du eine Notification in einem eigenen Thread machen?



    Hier noch ein Link zu einem PDF
    wo dir auch der Broadcast Receiver erklärt wird.


    https://www.google.com/url?sa=…Vaw2AyQzU4KCAtBvdAksDs80S

  • Danke, Jogimuc, für deine Einschätzung und die interessanten Links. Damit habe ich eine saftige Hausaufgabe, die mich mal ein paar Tage oder Wochen beschäftigen wird ... Anhand eines eigenen, konkreten Problems zu lernen ist aber wohl die motivierendste Art, zu lernen.


    Einzig eine Frage ist (im Moment) noch nicht beantwortet. Ich hätte sehr gern gewusst, warum mein obiger unter 3) aufgelisteter Code nach etwa 20 Repetitionen crasht. Da der Pieps 20-mal ertönt, kann der Code ja nicht grundsätzlich falsch sein. Wird der Speicher knapp, da immer neue Instanzen erzeugt und die alten nicht gelöscht werden?

  • Hallo


    Du startest den Timer in dem Konstruktor der Klasse TimerTask der läuft aber noch im Ui Thread. Die onRun läuft im eigenen Thread.
    Der Timer läuft wohl zu lange und erzeugt dadurch eine ANR.
    Welche Fehlermeldung ist denn im Log?


    Und lasse die Main Methode weg die bauchst du nicht. Wird bei einer Dektop anwendung benutzt nicht bei Android.



  • Ok, jogimuc, ich hab jetzt mal die Timer-Geschichte in meine MainActivity eingebaut (leicht andere Syntax als du schreibst - ich denke, bei dir sind noch ein paar Flüchtigkeitsfehler drin):


    Code
    Timer timer = new Timer();
          TimerTask test = new TimerTask() {
            @Override
            public void run() {
              ToneGenerator toneGen1 = new ToneGenerator(AudioManager.STREAM_MUSIC, 100);
              toneGen1.startTone(ToneGenerator.TONE_CDMA_PIP,150);
            }
          };
          timer.scheduleAtFixedRate(test,0, 1000);

    WIeder stürzt aber das Programm nach etwa 20 Sekunden (=20 Piepse) ab. Das Logcat habe ich schon im Posting Nr. 1 beigefügt (vielleicht irritiert dort der Titel "Quellcode", aber ich habe diese Darstellung als Code gewählt, weil dann die Zeilen numeriert werden und man so leicht darauf verweisen kann). Die ersten ca. 3 Zeilen gehören noch zum letzten Pieps, dann entgleist die App offensichtlich.


    Danke fürs Anschauen!

  • versuche es mal so

  • Wunderbar, Riiiiesendank, jogimuc, das funktioniert ^^ . Jetzt konnte ich auch die Piepserzeugung durch meinen minütlichen Test, ob "Mobile Daten" eingeschaltet sind, ersetzen. (Noch) nicht elegant, aber tut vorerst das, was ich will. Ich habe aber gemerkt, dass ich alles noch zu wenig gut verstehe, warum der Code gerade so lauten muss, und ich verschwinde mal in der Versenkung, um mich etwas schlauer zu machen. Vielleicht ist das Projekt mit dem Broadcast Receiver im Moment noch zu gross für mich. Wir werden sehen...


    Bis ein anderes Mal...

  • Hallo cl500merza


    Danke für das Lob. Ich bring das schon noch fertig, das ist ja die Herausforderung und das, was schlussendlich Spass macht (ist nicht mien Job, nur mein Hobby). Eine Version, die minütlich den Status abfragt, läuft ja schon auf meinem S9. Aber ich habe kein Patent auf meiner Idee (die wohl andere auch schon hatten), wenn du deinem Kumpel den Tipp geben willst - nur zu.


    Schöner Tag

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!