Hallo,
ich bin noch ziemlich Android-unerfahren und grüble schon seit vielen Tagen über ein Problem.
Ich bin nicht sicher, ob das mit meinem Konzept überhaupt machbar ist, und benötige dringend eure Hilfe:
Ich möchte eine App schreiben, die zyklisch die Position des Handys per Fused Location Provider Client abfragt.
Wenn ich in die Nähe meiner Heimatkoordinaten komme, soll per TCP/IP ein Kommando an meinen Server zuhause gesendet werden.
Zunächst habe ich zum Test 2 getrennte Apps verwendet:
1. Senden von beliebigen TCP/IP Daten an meinen Server zuhause.
Die Main Activity erzeugt einfach einen Thread, übergibt im Konstruktor des Threads die Sendedaten, und der Thread beendet sich einfach wieder selbst,
wenn er das Kommando verschickt hat.
Das funktioniert soweit.
2. Zyklisches feststellen der Position.
Da das auch dann funktionieren soll, wenn die App im Hintergrund oder gar beendet worden ist, stoße ich in der App einfach zyklische Location Updates an,
und diese landen in der onReceive-Methode eines Broadcast-Receivers.
Das funktioniert auch (auch wenn die App beendet wurde ).
Jetzt mein Problem:
Wenn ich versuche, beide Apps zu einer zusammenzufügen, (den funktionierenden TCP/IP-Thread aus der ersten App
in die zweite einbauen) stürzt meine App ab.
Meine Frage:
Geht das überhaupt, aus der onReceive-Methode eines Broadcast-Receivers TCP-IP Daten übers Netzwerk zu schicken?
Wenn ja, muss man da was Spezielles beachten?
Ich habe mal den Code des TCT/IP Threads hinzugefügt.
Diesen Thread erzeuge und starte ich aus der onReceive-Methode des Broadcast Receivers
Kommentiert man alles aus, was direkt mit dem Netzwerk zu tun hat, läuft die App.
Sobald ich einen Socket erstelle beendet sich die App.
public class NetworkThread implements Runnable
{
public static final String SERVER_HOST = "Meinhost.de"; // server Hostname
public static final int SERVER_PORT = Meinport; // server Port
private Socket clientSocket;
private PrintWriter out;
private String strToSend;
public NetworkThread( String strParam )
{
// sendestring im konstruktor merken
strToSend = strParam;
}
@Override
public void run()
{
// dieser beep kommt noch
ToneGenerator toneGen = new ToneGenerator(AudioManager.STREAM_ALARM, 100);
toneGen.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 400);
// UND DER FOLGENDE TEIL BEENDET DIE APP (crash)
try
{
clientSocket = new Socket(SERVER_HOST, SERVER_PORT);
out = new PrintWriter(clientSocket.getOutputStream(),true);
out.println(strToSend);
clientSocket.close();
}
catch(IOException e)
{
System.out.println("Unknown host:");
}
}
}
Alles anzeigen