Beiträge von Adreoid

    Hallo,
    ich bin Anfänger und habe meine erste App geschrieben.
    Mit dieser App kann ich das Rolltor und das Licht meines CarPorts bedienen.
    Das funktioniert mit UDP-Kommandos, die ich über das WLAN im Heimnetz versende.
    Die App funktioniert bis auf ein kleines Problem perfekt:


    Wenn ich von aussen ( nicht in Reichweite meines Heimrouters ) den Empfangsbereich meines Routers "betrete",
    braucht mein Handy relativ lange, um sich mit dem Router zu verbinden.
    Diese Zeit würde ich gerne verkürzen, mir fehlt aber die rettende Idee.


    Momentan mache ich folgendes:
    Wenn ein Button ( zum Beispiel Tor-Auf ) gedrückt wird, wird zuerst folgende Funktion ( oder heißt das Methode ?)
    aufgerufen:
    Diese Funktion soll:
    1. Das WLAN Interface des Handys einschalten, falls es ausgeschaltet ist. ( Es ist aber eingeschaltet )
    2. Wenn keine Verbindung zu einem Router besteht, eine Verbindung aufbauen.
    3. Prüfen, ob ich mit meinem eigenen Router verbunden bin
    Wenn das alles erledigt ist, wird das Kommando gesendet ( was dann sehr spät gemacht wird )


    Hier die Funktion:

    Jetzt zu meinen Fragen:
    1. Macht die Funktion so Sinn, oder geht das geschickter?
    2. Ich habe die Idee, diese Funktion nicht erst bei einem Button-Event aufzurufen,
    sondern schon dann, wenn der Power-Button des Handys gedrückt wird. Würde das was bringen, oder
    versucht das Handy sowieso schon eine Verbindung aufzubauen, wenn der Power-Button gedrückt wird, und es dauert eben einfach so lange?


    Vielen Dank im Voraus, und bitte nicht über meinen Code (Kot) lachen. Bin Anfänger.

    Hallo Champ,
    zunächst mal möchte ich dir danken, dass du hier so aktiv alle NewbeeFragen beantwortest.
    Ich finde es bewundernswert, wenn sich jemand diese Zeit nimmt und die Geduld aufbringt.


    Ich finde, das musste mal gesagt werden !


    Zu deiner Antwort:


    Doch, die Init Funktion wird aufgerufen, und zwar von meiner Activity, nachdem ich den Alarm mit new erzeugt habe.
    Ich dachte nur, wenn man ein Objekt (Alarm) mit new erzeugt, dann hat man eine neue Instanz und kann in dieser aller Funktionen ( auch die Init ) aufrufen.


    Wie du dargelegt hast, scheint das wohl doch nicht so zu sein.
    Wenn ich dich richtig verstanden habe, rufe ich die Init Funktion in einer Instanz des Alarms auf, der Alarm selbst läuft aber in einer anderen Instanz. Deshalb war der Listener auch null, wenn der Alarm ausgelöst hat.( Laienhaft ausgedrückt, ich stecke da noch nicht so ganz drin, ich kenne mich bisher nur etwas mit C++ aus, Java ist völlig neu für mich ).


    Ich hatte mir allerdings eine andere Erklärung für das Phänomen ausgedacht:
    Ich dachte, dass jedesmal, wenn der Alarm ausgelöst wird, eine neue Instanz des Alarms erzeugt wird, und gelöscht wird, wenn der Alarm behandelt ist. Und damit sind auch alle Klassenvariablen innerhalb des Alarms nach dem Löschen futsch.


    Dein Tip, den Listener gleich bei der Variablendeklaration im Kopf des Alarms anzulegen, war jedenfalls gut.


    Wenn allerdings meine Vermutung zutrifft, und die Alarminstanz bei jedem Auslösen des Alarms neu erzeugt wird, dann ist das dann das Gleiche in Grün, weil:


    Code
    ObjectType object;
    
    
    object = new ObjectType;


    ist das Gleiche wie:

    Code
    ObjectType object = new ObjectType;


    Leider kann ich im Moment nicht ausprobieren, ob das jetzt auch auf dem zweiten Handy funktioniert, für den ich diese App eigentlich gedacht habe. Auf meinem Handy geht das jedenfalls.

    Wenn ich den Locationmanager wie üblich programmiere, bekomme ich andauernd Location Updates.
    Ich möchte aber nur genau alle 15 Minuten eine Standortabfrage durchführen.
    Also benutze ich einen Alarm, der periodisch alle 15 Minuten auslöst.
    Und in der zyklischen Alarmfunktion rufe ich ein mal die SingleUpdate Funktion des LocationManagers auf.
    Diese ermittelt dann die Position und ruft den Listener auf.
    Geht das auch einfacher?


    Ach ja, und ich habe gelesen, das Belastung der Batterie des Handys geringer sein Soll, wenn man einen Alarm benutzt.
    Ich denke, en Service würde ständig im Hintergrund laufen und Strom verbrauchen

    So, habs nochmal mit dem Listener als Member-Funktion des Alarms probiert und
    genauere Ausgaben gemacht.
    Das Problem ist folgendes:
    Der Listener wird in einer Membervariablen des Alarms gespeichert.


    Wenn ich den Listener einmalig am Anfang in der Init-Funktion erzeuge und der Variablen zuweise,
    zeigt die Variable auf das erzeugte Objekt ( den Listener ).


    Wenn dann später der Alarm auslöst, ist die Variable aber null.


    Hier der relevante Code:

    Eben, das mit den ständig erzeugten Listenern kam mir auch merkwürdig vor.
    Warum macht man sowas?
    Das kann doch nur funktionieren, wenn der Listener nach dem Aufruf wieder zerstört wird.


    Mit dem Listener als Member des Alarms stürzte die App immer ab.
    "Es tut uns Leid, MyApplication wurde leider beendet".
    Ich habe leider noch nicht herausbekommen können, ob es irgendwo eine Log-Datei gibt und wie
    man sie liest.
    Ich kann's ja nochmal ausprobieren, ist schon ne Weile her. Ich kann mich jetzt nicht mehr genau erinnern,
    wann der Ansturz erfolgte.


    Die Handys sind komplett identisch, Android Version ist 4.4.4.

    Jetzt wird's merkwürdig:
    Ich hätte gerne zyklisch ( alle 15 Minuten ) eine Info über meine aktuelle Position.


    Ich habe per Alarmmanager einen zyklischen 15 Minuten Alarm gestartet. Der kommt auch.


    Im Broadcast Receiver des Alarms rufe ich dann die Funktion:

    Code
    locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    if (locationManager != null)
    {
      Toast.makeText(context, "SingleUpdate", Toast.LENGTH_LONG).show();
      locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, locationListener, null);
    }



    Durch die Toast-Ausgabe kann ich sehen, das die SingleUpdate Funktion wirklich alle 15 Minuten aufgerufen wird.


    Und jetzt kommt das Merkwürdige:
    Ich habe zwei völlig identische Handys, zur gleichen Zeit beim gleichen Handler gekauft.
    Bei dem ersten Handy funktioniert alles, beim zweiten wird der Listener nicht aufgerufen.
    Kann sich jemand einen Reim darauf machen?


    Hier der relevante Code als Auszug:

    Was noch merkwürdig ist:
    Ich hatte den Listener zuerst als separate Memberfunktion des Alarms geschrieben und den Listener nur einmal am Anfang erzeugt.
    Dabei ist meine App aber ständig abgestürzt.
    Die oben angegebene Vorgehensweise ( Listener mit new in der onReceiveFunktion erzeugen ) habe ich aus einem Beispiel.
    Das kommt mir sehr suspekt vor, hat aber funktioniert.

    Vielen Dank für die Antwort.
    Das Problem lag aber woanders:
    Ich hab's zwar noch nicht so richtig verstanden, aber für jede gestartete App
    (meine auch) scheint Android ein lokales Dateisystem anzulegen, welches
    nur für die App selbst sichtbar ist.
    Meine App hat die Dateien zwar erzeugt, man konnte sie nur nicht auf der SD-Karte
    sehen ( per USB auf einem PC ).


    Der Sinn war folgender:
    Ich wollte zyklisch Daten in eine Log-Datei schreiben und diese dann später per PC
    am USB-Port auslesen.
    Die Datei existiert. Ich kann sie auch per App zurücklesen.
    Nur vom PC aus kann ich sie nicht sehen und öffnen.

    Hat niemand eine Idee?
    Ich habe zwischenzeitlich noch mehr probiert.
    Ich bin mir ziemlich sicher, alles richtig gemacht zu haben.
    Hier ist ein anderes Beispiel, das ich versucht habe:


    Ich versuche diesmal einen Applikationsfolder auf dem internen Speicher anzulegen.
    mkdirs() liefert aber immer false zurück und das Verzeichnis wird nicht erzeugt.


    Und bevor jemand fragt: Ja, die permissions WRITE_EXTERNAL_STORAGE
    sind angegeben.

    Code
    File applFolder = getFilesDir();
    //kontrollausgabe des pfades
    Toast.makeText(getApplicationContext(), applFolder.getPath(),Toast.LENGTH_LONG).show();
    
    
    retVal = applFolder.mkdirs();
    if (retVal == false)
        Toast.makeText(getApplicationContext(), "RETVAL FALSE", Toast.LENGTH_LONG).show();

    Hallo Forum,
    es klingt trivial, aber ich bekomme es einfach nicht hin, eine Textdatei zu erzeugen
    und darin zyklisch Daten abzulegen.
    Im Netz sind viele Beispiele zu finden, aber bisher ist es mir nicht gelungen, damit eine Datei
    zu erzeugen.
    Ich möchte folgendes erreichen.
    Bei Programmstart soll einfach eine Textzeile in eine existierende Textdatei geschrieben
    (angehängt ) werden.
    Die Datei wird also bei jedem Start um eine Zeile größer.
    Wenn die Datei nicht existiert, soll sie erzeugt werden.
    Hat jemand ein funktionierendes Beispiel, wie das geht?


    Hier ist ein Beispiel, welches NICHT funktioniert. Es ist keine Textdatei zu finden:

    Hallo,
    ich stehe mal wieder auf dem Schlauch und brauche einen Tip:
    Ich habe eine Activity, in der in der onCreate Methode ein Thread gestartet wird.
    Leider wird die onCreate Methode mehrfach aufgerufen.
    Merkwürdigerweise dann, wenn der Bildschirmschoner aktiv wird und nochmal,
    wenn das Display wieder aktiviert wird.
    Dadurch wird mein Thread natürlich auch mehrfach gestartet.
    Hat jemand eine Idee, wie man das verhindern kann?


    Vielen Dank im Voraus


    Hier ein Codeschnipsel (unnötiges entfernt :(


    Hallo,
    ich bin Android Programmieranfänger und kämpfe seit Tagen mit einem scheinbar unlösbaren Problem:
    Ich habe eine Main-Applikation die einen Service startet.
    Der Service wiederum startet einen unabhängigen Thread, der auf eingehende TCP-IP-Pakete lauscht.
    Nach dem Start des Service wird die Main-Applikation wieder beendet, der Service und der Thread läuft
    im Hintergrund weiter.
    Trifft ein bestimmtes TCP-IP Paket ein, soll der Thread die Mainapplikation erneut starten,und diesen
    Start bekomme ich einfach nicht hin.
    Im Internet gibt es zwar eine Menge Beispiele,von denen ich aber keines kompilieren kann, weil die dort
    genannten Funktionen vom Thread heraus nicht aufrufbar sind.
    Hat jemand eine Idee, wie das funktionieren könnte?


    Ein oft genanntes Beispiel lautet so:


    Code
    final Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                        intent.setAction(Intent.ACTION_VIEW);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    
    
                        startActivity(intent);

    In diesem Beispiel kommt beim kompilieren eine Fehlermeldung für getApplicationContext() und startActivity()