wake-up-neo.net

Android - Periodic Background Service - Beratung

Ich arbeite an einer App, die Informationen zu ihrem Standort an einen Remote-Server übermittelt. Ich beabsichtige, dies durch einen einfachen HTTP-Post an den Webserver zu tun, und alles ist einfach und gut.

Laut der Spezifikation muss sich die App von Zeit zu Zeit selbst ausführen, etwa alle 30 Minuten. Seien Sie unabhängig von der Benutzeroberfläche, dh sie muss auch dann ausgeführt werden, wenn die App geschlossen ist.

Ich habe mich umgesehen und herausgefunden, dass Android-Services verwendet werden müssen. Was könnte ich verwenden, um ein solches System zu implementieren. Wird der Dienst (oder ein anderer Mechanismus) neu gestartet, wenn das Telefon neu gestartet wird? 

Danke im Voraus.

27
Ziyan Junaideen

Erstellen Sie eine Service, um Ihre Informationen an Ihren Server zu senden. Vermutlich haben Sie das unter Kontrolle. 

Ihr Service sollte durch einen Alarm gestartet werden, der vom AlarmManager ausgelöst wird, wo Sie ein Intervall angeben können. Wenn Sie nicht alle 30 Minuten Ihre Daten genau melden müssen, möchten Sie wahrscheinlich den ungenauen Alarm, damit Sie etwas Akkulaufzeit sparen können.

Schließlich können Sie Ihre App registrieren, um die Boot-Broadcasts zu erhalten, indem Sie ein BroadcastReceiver wie folgt einrichten:

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {  
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            // Register your reporting alarms here.            
        }
    }
}

Sie müssen Ihrem AndroidManifest.xml die folgende Berechtigung hinzufügen, damit dies funktioniert. Vergessen Sie nicht, Ihre Alarme zu registrieren, wenn Sie die App normal ausführen. Andernfalls werden sie nur beim Start des Geräts registriert.

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>
30
Argyle

Hier ist eine andere Art, den Dienst für immer aufrecht zu erhalten. Es gibt Möglichkeiten, es im Code zu töten, wenn Sie möchten

Hintergrunddienst:

package com.ex.ample;

import Android.app.Service;
import Android.content.*;
import Android.os.*;
import Android.widget.Toast;

public class BackgroundService extends Service {

    public Context context = this;
    public Handler handler = null;
    public static Runnable runnable = null;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show();

        handler = new Handler();
        runnable = new Runnable() {
            public void run() {
                Toast.makeText(context, "Service is still running", Toast.LENGTH_LONG).show();
                handler.postDelayed(runnable, 10000);
            }
        };

        handler.postDelayed(runnable, 15000);
    }

    @Override
    public void onDestroy() {
        /* IF YOU WANT THIS SERVICE KILLED WITH THE APP THEN UNCOMMENT THE FOLLOWING LINE */
        //handler.removeCallbacks(runnable);
        Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onStart(Intent intent, int startid) {
        Toast.makeText(this, "Service started by user.", Toast.LENGTH_LONG).show();
    }
}

So beginnen Sie mit Ihrer Hauptaktivität oder wo immer Sie möchten:

startService(new Intent(this, BackgroundService.class));

onDestroy() wird aufgerufen, wenn die Anwendung geschlossen oder beendet wird, der Runable jedoch sofort startet.

Ich hoffe das hilft jemandem.

Der Grund, warum einige Leute dies tun, ist auf Unternehmensanwendungen zurückzuführen, bei denen die Benutzer/Mitarbeiter in bestimmten Fällen bestimmte Dinge nicht stoppen können müssen :)

http://i.imgur.com/1vCnYJW.png


EDIT

Seit Android O (8.0) müssen Sie JobManager für geplante Aufgaben verwenden. Es gibt eine Bibliothek namens Android-Job von Evernote , die die periodische Hintergrundarbeit auf allen Android-Versionen zum Kinderspiel macht. Ich habe auch eine Xamarin-Bindung aus dieser Bibliothek gemacht.

Dann müssen Sie nur noch folgendes tun:

In Ihrer Bewerbungsklasse:

public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        JobManager.create(this).addJobCreator(new MyJobCreator());
    }
}

Erstellen Sie die folgenden zwei Klassen YourJobCreator und YourSyncJob (Wo die gesamte Arbeit erledigt wird. Android legt Zeit für die Ausführung aller Hintergrundjobs fest. Für Android-Versionen <8.0 wird es weiterhin wie üblich mit einem Alarmmanager und Hintergrunddienst ausgeführt.) 

public class MyJobCreator implements JobCreator {

    @Override
    @Nullable
    public Job create(@NonNull String tag) {
        switch (tag) {
            case MySyncJob.TAG:
                return new MySyncJob();
            default:
                return null;
        }
    }
}

public class MySyncJob extends Job {

    public static final String TAG = "my_job_tag";

    @Override
    @NonNull
    protected Result onRunJob(Params params) {
        //
        // run your job here
        //
        //
        return Result.SUCCESS;
    }

    public static void scheduleJob() {
        new JobRequest.Builder(MySyncJob.TAG)
                .setExecutionWindow(30_000L, 40_000L) //Every 30 seconds for 40 seconds
                .build()
                .schedule();
    }
}
15
Pierre

Sie sollten Ihren Dienst mit dem Alarmmanager einplanen. Erstellen Sie zunächst die ausstehende Dienstabsicht:

Intent ii = new Intent(getApplicationContext(), MyService.class);
PendingIntent pii = PendingIntent.getService(getApplicationContext(), 2222, ii,
PendingIntent.FLAG_CANCEL_CURRENT);

Dann planen Sie es mit Alarm-Manager:

//getting current time and add 5 seconds to it
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 5);
//registering our pending intent with alarmmanager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);

nach 5 Sekunden wird der Dienst gestartet. Sie können Ihren Alarm wiederholen lassen.

8
SohailAziz

Sie können Alarm Manager verwenden, um den Service zu einer bestimmten Zeit zu starten und den Alarm in einem bestimmten Intervall zu wiederholen. Wenn der Alarm ausgelöst wird, können Sie den Dienst starten und eine Verbindung zum Server herstellen und machen, was Sie möchten

0
vandzi