Планировщик заданий - как запустить действие в фоновом режиме без запуска приложения - PullRequest
0 голосов
/ 20 марта 2019

Я только что создал Android-приложение для доставщика, в котором администратор может назначить ему обязанность через сервер.

Проблема в том, что мне нужна функция, в которой приложение может автоматически отправлять широту и долготу на сервер каждые 5 минут, я использовал планировщик заданий, но он работает только в моем старом телефоне, который является Android Lollipop, это не работает в Android Nougat.

MyService.java

package com.example.dell.firebase;

import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;

import com.firebase.jobdispatcher.JobParameters;
import com.firebase.jobdispatcher.JobService;

/**
 * Created by DELL on 3/20/2019.
 */

public class MyService extends JobService{
    BackgroundTask ba;
    @Override
    public boolean onStartJob(final JobParameters job) {

        ba=new BackgroundTask(){
            @Override
            protected void onPostExecute(String s) {
                Toast.makeText(getApplicationContext(),"hello all "+s,Toast.LENGTH_SHORT).show();
                Log.d("dd","hg");
                jobFinished(job,false);
            }
        };

        ba.execute();
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters job) {
        return true;
    }
    public static class BackgroundTask extends AsyncTask<Void,Void,String>
    {




        @Override
        protected String doInBackground(Void... voids) {

            return "hello from background";
        }
    }

}

Мой код XML

<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.dell.firebase.MainActivity">   

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="150dp"

    android:onClick="startjob"
    android:text="start" />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="30dp"
    android:onClick="stopjob"
    android:text="stop" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>

MainActivity.java

package com.example.dell.firebase;

import android.annotation.SuppressLint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.firebase.jobdispatcher.Constraint;
import com.firebase.jobdispatcher.FirebaseJobDispatcher;
import com.firebase.jobdispatcher.GooglePlayDriver;
import com.firebase.jobdispatcher.Job;
import com.firebase.jobdispatcher.Lifetime;
import com.firebase.jobdispatcher.RetryStrategy;
import com.firebase.jobdispatcher.Trigger;

import java.util.concurrent.TimeUnit;


public class MainActivity extends AppCompatActivity {
    private static final String jobtag="Mytag";
    private FirebaseJobDispatcher jobDispatcher;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        jobDispatcher=new FirebaseJobDispatcher(new GooglePlayDriver(this));

    }

    public void startjob(View view) {
        Job job=jobDispatcher.newJobBuilder()
                .setService(MyService.class)
                .setLifetime(Lifetime.FOREVER)
                .setRecurring(true)
                .setTag(jobtag)
                .setTrigger(Trigger.executionWindow(10,15))
                .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                .setReplaceCurrent(false)
                .setConstraints(Constraint.ON_ANY_NETWORK)
                .build();
        jobDispatcher.mustSchedule(job);
        Toast.makeText(this,"job Scheduled",Toast.LENGTH_SHORT).show();
    }

    public void stopjob(View view) {
        jobDispatcher.cancelAll();
        Toast.makeText(this,"job Canceled",Toast.LENGTH_SHORT).show();
    }
}

1 Ответ

0 голосов
/ 20 марта 2019

Ну, я не уверен, но каждые 5 минут не приемлемы для нуги и после. Минимальный интервал времени для планировщика заданий составляет 15 минут , так что это может быть проблемой. С кодом мы могли бы помочьбольше.

...