Aplikacja wysyłająca okresowo dane na serwer

0

Witam.

Chce stworzyć aplikację na telefon która okresowo będzie wysyłać dane na serwer.
Ma działać "w tle", tzn nie zależnie od tego czy użytkownik ją włączy czy nie.

Jako, że z programowaniem na Androida prawie styczności nie miałem to proszę o podpowiedź.
Czy jedynym sposobem jest stworzenie aplikacji uruchamiającej serwis Foreground?
Jeżeli tak to czy można zrobić to tak aby w powiadomieniach nie pokazywała się informacja o tym, że usługa jest aktywna?

Początkowo myślałem, że wszystkie aplikacje typu facebook/whatsapp itp działają w tle i okresowo sprawdzają na serwerze czy nie ma jakichś nowych wiadomości, ale z tego co znalazłem w sieci to działa to w drugą strone. Tzn serwer aplikacji wysyła powiadomienie na urządzenie (przez Firebase Cloud Messaging), usługa systemowa to powiadomienie przetwarza i w określonych przypadkach przekazuje do konkretnej aplikacji.

Czy takie powiadomienie mogło by powodować w aplikacji akcję wysłania danych na serwer?
Sprowadziło by się to do tego, że serwer aplikacji np co 10 min wysyłał by na urządzenie powiadomienie typu "wyślij mi dane X", usługa systemowa przekazywała by to powiadomienie do aplikacji, a aplikacja zbierała by dane X i wysyłała na serwer.

Z góry dziękuję za pomoc.
Pozdrawiam.

1

Nie, to jest dokładnie to czego używać nie powinieneś.

Użyj JobScheduler albo WorkManager.

Albo po prostu użyj jakiejś gotowej apki z półki sklepowej.

0

@hipekk:

Jakiej natury te dane? jak jest ich dynamika ? Kiedy ich wysłanie jest ważne?
najlpoeiej, niech każda strona odpowieda za siebie. "Mam powód, to postaram się wysłać"

Realny produkcyjny projekt, czy wprawki i ćwiczenia ?

0

@ZrobieDobrze:

To ma być aplikacja do własnego użytku.
Także takie użycie "pół produkcyjne" ;).

Mają to być dane odczytane z sensorów telefonu i w sumie to dobrym pomysłem będzie wysyłanie tylko wtedy gdy się zmienią. Nie ma co spamować co x minut, jeżeli odczyt jest ten sam.

0
marian pazdzioch napisał(a):

Nie, to jest dokładnie to czego używać nie powinieneś.

Użyj JobScheduler albo WorkManager.

Albo po prostu użyj jakiejś gotowej apki z półki sklepowej.

Tyle teorii. W praktyce i tak system ubije to żeby oszczędzić baterię. Xiaomi np ubija wszytko jak leci, inne telefony też w większości. Może czysty Android na Pixelu by się tak nie zachowywał - nie wiem. Więc wyjściem jest albo odpytywanie przez FCM, albo foreground service, albo podpięcie się pod usługę systemowego budzika. Czyli robisz tak jakby swoją aplikację budzika, ustawiasz czas kiedy ma się wybudzić, ale zamiast dzwonić to np wysyłasz dane. Minusem będzie to, że pojawi się ikona alarmu na pasku zadań (zegarek), tak jak po ustawieniu budzika.

Innych pewnych metod nie ma. Tutaj bateria priorytet niestety.

0

Prawie udało się zrobić "szkielet".
Prawie... ;)

Idąc za radą @marian pazdzioch użyłem JobScheduler'a.
Podpiąłem go pod BroadcastReceiver.
W metodzie onReceive w klasie popiętej pod receiver uruchamiam taką metodę:

public static void scheduleJob(Context context) {
    try
    {
        ComponentName serviceComponent = new ComponentName(context, TestJobService.class);
        JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
        builder.setMinimumLatency(3 * 1000);
        builder.setOverrideDeadline(5 * 1000);
        JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
        jobScheduler.schedule(builder.build());
    } 
    catch (Exception e) 
    {
        MyLogger.write(e);
    }
}

TestJobService nie robi póki co nic po za logowaniem.

public class TestJobService extends JobService {
    private static final String TAG = "TestService";
    private static int counter = 0;

    @Override
    public boolean onStartJob(JobParameters params) {
        MyLogger.write("TestJobService -> onStartJob [" + counter + "]);
        counter ++;
        
        MySheduler.scheduleJob(getApplicationContext()); // reschedule the job
 
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        MyLogger.write("TestJobService -> onStopJob");
        
        return true;
    }
}

Problem w tym, że zadanie uruchamia się dokładnie 20 razy.
Kolejne razy się nie wykonuje,

W artykule na którym się wzorowałem LINK autor wspomniał, że zadanie wykona się 20 razy (ale nie wyjaśnił dlaczego).
screenshot-20221125224327.png

No i tu prośba o pomoc: dlaczego to przechodzi akurat 20 razy? I jak ten limit zmienić/usunąć?

0

@gajusz800: możesz mi nakreślić jak to może działać z FCM?

Może z serwera aplikacji wysłać "wiadomość", po odebraniu której aplikacja zamiast wyświetlić powiadomienie wyśle requesta www?

1 użytkowników online, w tym zalogowanych: 0, gości: 1