Wpis z mikrobloga

#android #programowanie #androidstudio

Wizja #programista15k zachęca do kodzenia, no ale nie wszystko jest proste.
tl;dr: Chcę uzyskać stałe połączenie po TCP pomiędzy urządzeniem w sieci lokalnej i androidem, całkowicie w tle (nawet jak wyrzuci się apkę z aplikacji działających w tle).

Opis (można pominąć):
Załóżmy że mam czujnik ruchu podpięty do urządzenia które ma moduł WiFi i potrafi wysyłać pakiety. Z poziomu androida chcę dostać, odebrać i przetworzyć pakiet TCP wysłany przez czujnik ruchu na podany adres lokalny androida. Załóżmy, że czyszczę RAM telefonu co jakiś czas i wywalam wszystkie apki, których nie używam, więc to ma działać całkowicie w tle. Na koniec powiedzmy, że chcę natychmiast otrzymać wiadomość od czujnika, więc GCM i takie tam nie działają - moim zdaniem to powinny być pakiety lecące w sieci lokalnej.

Aktualne rozwiązanie:
Obecnie mam klasę PingService, która dziedziczy po Service, w tej klasie trwa komunikacja i wysyłanie pakietów. Service uruchamiam metodą startForeground(), żeby istniał w tle i żebym wiedział że działa połączenie TCP i urządzenie i czujnik działa. Niestety przez to, że tworzę Sockety w serwisie, muszę je tworzyć i obsługiwać w innym procesie niż główny - robię to w AsyncTasku. W AsyncTasku również odbieram przetwarzam i odsyłam pakiety bo to też blokuje wątek (tak, to while(true), ale kod okrojony, jednak powinno to tak wyglądać - metoda komunikująca się ma działać cały czas). No i pomimo tego, że AsyncTask jest uruchamiany z poziomu Service'u, to wydaje się nie być jego częścią - Service działa w tle, powiadomienie w belce jest, ale AsyncTask po pewnym czasie przestaje się wykonywać.
Wydaje mi się że robię coś źle, bo na stacku ktoś pisał, że uzyskał dokładnie to o czym piszę, ale u mnie nie działa, nie potrafię dojść to tego stanu, a kodu tamta osoba nie dostarczyła.

Macie jakieś pomysły? Próbowałem w manifeście do service dodać android:process, które powinno uruchomić serwis w oddzielnym procesie, ale AsyncTask z tego co wiem jest oddzielnym procesem i to chyba złe podejście. Próbowałem zamiast AsyncTaska użyć Thread, wydawało się nie działać. Zamiast Service rozszerzałem IntentService, też brak efektu (chociaż tutaj mogłem coś sam skopać). Jeszcze kilka innych których nie pamiętam

AndroidManifest:
``

MainActivity:

public void connect()
{
InetAddress proximityAddress = new InetAddress("192.168.1.2") //przykładowy adres IP, inaczej go zdobywam, ale tak to działa
Intent intent = new Intent(this, PingService.class);
intent.putExtra("proximityAddress", proximityAddress.getHostAddress());
startService(intent);
}

PingService:
pastebin.com/9iA0VR2d

Za wszelką pomoc będę wdzięczny. Kod okrojony na potrzeby wpisu, więc jeśli gdzieś są źle tabulacje, nawiasy, wybaczcie, ale mam nadzieję, że ogólny zamysł działania jest przedstawiony jasno. W razie pytań piszcie. Będę wdzięczny za każdą pomoc - może wszystko jest źle zrobione, albo mam literówkę we wpisie i grammarnazi, wtedy też piszcie :P. Już naprawdę nie mam pomysłu, Stack przejrzałem wzdłuż i wszerz, ale nie udało mi się, więc pytam Was.
  • 2