webentwicklung-frage-antwort-db.com.de

Der geplante Arbeiter des Android-Workmanagers ging nach der getöteten Aufgabe verloren

Ich versuche, alle 15 Minuten einen Worker-Run mit der neuen WorkManager-API, 1.0.0-alpha06, zu erstellen. Wenn ich mich nicht irre, sollte der Workmanager mit PeriodicWorkRequest dazu führen, dass der Worker die Aufgabe beendet und das Telefon neu startet , aber wenn ich die Aufgabe aus den letzten Apps wische, ist der geplante Arbeiter verloren (ich habe etwa 45 Minuten gewartet, um Protokolle des Arbeiters mit einem Intervall von 15 Minuten anzuzeigen).

das sind meine Dateien:

MyExampleWorker.Java:

public class MyExampleWorker extends Worker{
    public static final String TAG = "MY_EXAMPLE_WORKER";

    @NonNull
    @Override
    public Result doWork() { 
        Log.i(TAG, "Starting background worker");
        // Getting configuration data
        long param1 = getInputData().getLong("param1", 60000);
        String param2 = getInputData().getString("param2");
        String param3 = getInputData().getString("param3");

        PackageManager pckMgr = mContext.getPackageManager();
        ...
        ..
        .
        return Result.SUCCESS;
    }

}

Main.Java:Diese Methode wird ausgelöst, sobald die App gestartet wird

@ReactMethod
public void execute() {
    Log.i(TAG, "inside execute, setting up periodic worker in workManager");

    Data inputData = new Data.Builder()
            .putLong("param1", 60000)
            .putString("param2", "something")
            .putString("param3", "something else")
            .build();

    PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
            .Builder(MyExampleWorker.class, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS)
            .setInputData(inputData)
            .addTag(MyExampleWorker.TAG)
            .build();

    WorkManager.getInstance().enqueueUniquePeriodicWork(MyExampleWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
}

UPDATE: nicht nur das, aber wenn ich die app noch einmal öffne, sehe ich das log für "inside", ein periodischer Worker in workManager einrichten ", aber der Worker scheint es nicht zu sein geplant, war es über eine Stunde und in logcat sind keine Protokolle für den Arbeiter vorhanden.

Fehlt mir hier etwas?

Jede Hilfe wird sehr geschätzt !!

Diego

7
Dieguinho

Dies ist das Problem, das durch die Batterieoptimierung und/oder den Doze-Modus verursacht wird und insbesondere dann auftritt, wenn Sie ein chinesisches Rom wie Oxygen OS, MIUI usw. verwenden.

Testen Sie Ihre App auf Stock Roms, dies wird einwandfrei funktionieren. Es würde überhaupt keine Probleme geben. Dies liegt daran, dass diese chinesischen ROM ihre benutzerdefinierten Energiespartechniken aktivieren, die die Ausführung von Hintergrunddiensten verhindern.

Zwei Dinge, die Sie tun können:

  1. Verwenden Sie die Option "Batterieoptimierung ignorieren" und setzen Sie Ihre App in die Whitelist. Wenn Sie dies aktivieren, wird ein Benutzer wie folgt gefragt,

enter image description here

Sie können programmgesteuert fragen

    Intent intent = new Intent();
    String packageName = context.getPackageName();
    PowerManager pm = (PowerManager) 
    context.getSystemService(Context.POWER_SERVICE);
    if (pm.isIgnoringBatteryOptimizations(packageName))
        intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
    else {
      intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
      intent.setData(Uri.parse("package:" + packageName));
    }
    context.startActivity(intent);

Und in deinem Manifest

<uses-permission 
Android:name="Android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

Auf diese Weise können Sie Ihre App auf eine Whitelist setzen und der Arbeitsmanager wird funktionieren , aber leider wird Google Ihre App aus dem Play Store entfernen, wenn Sie die oben genannte Erlaubnis anfordern. Niemand weiß warum !!!

Lesen Sie diesen Artikel zu den Anti-Trust-Problemen von Google

  1. Die zweite Methode ist, dass Sie die Benutzer auffordern können, ihre App auf die Whitelist zu setzen, indem Sie das obige Dialogfeld nicht anzeigen. Du kannst das

startActivityForResult(new Intent(Android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS), 0);

4
This Guy Codes