Диспетчер заданий Firebase не запускает мой класс JobService при запуске кода на моем устройстве реального времени, почему?

Я работаю над проектом, который использует диспетчер заданий firebase для планирования задания, которое выполняется с интервалами. Но дело в том, что я запустил код на эмуляторе студии Android, и он работал нормально. Задание было запланировано, и я получил тост от класса обслуживания, показывающий, что выполнение кода выполнено успешно. Однако я попытался запустить его на телефоне Android в реальном времени, код создается и запускается на устройстве, но задание никогда не запланировано , сообщение не получено. Я перепробовал все, но класс jobService так и не был вызван. Я попытался снова запустить приложение на эмуляторе, и оно работает нормально, но оно никогда не работало на моем устройстве реального времени. Пожалуйста, в чем может быть причина этого. Я добавил зависимость firebase gradle в файл build.gradle. Я добавил jobService в папку манифеста. Я не просто знаю, в чем причина этого затруднительного положения. Пожалуйста, мне нужно объяснение. БЛАГОДАРЮ.

Основное действие

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import static android.R.attr.start;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    Button start_job, stop_job;
    private static final String Job_Tag = "myJobTag";
    private FirebaseJobDispatcher jobDispatcher;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        jobDispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));

        start_job = (Button) findViewById(R.id.start_job);
        stop_job = (Button) findViewById(R.id.stop_job);

        start_job.setOnClickListener(this);
        stop_job.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.start_job){

            Job job = jobDispatcher.newJobBuilder()
                    .setService(MyFirebaseJobScheduler.class)
                    .setLifetime(Lifetime.FOREVER)
                    .setRecurring(true)
                    .setTag(Job_Tag)
                    .setTrigger(Trigger.executionWindow(1, 2))
                    .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                    .setReplaceCurrent(false)
                    .setConstraints(Constraint.ON_ANY_NETWORK)
                    .build();
            jobDispatcher.mustSchedule(job);
            Toast.makeText(this, "Job scheduled.", Toast.LENGTH_SHORT).show();

        }else if(v.getId() == R.id.stop_job){
            jobDispatcher.cancel(Job_Tag);
            Toast.makeText(this, "Job canceled.", Toast.LENGTH_SHORT).show();
        }
    }
}

Класс JobService

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

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

public class MyFirebaseJobScheduler extends JobService {

    BackgroundScheduledTask backgroundScheduledTask;

    @Override
    public boolean onStartJob(final JobParameters jobParameters) {
        Log.d("JobDispatcher", "Job Called");
        backgroundScheduledTask = new BackgroundScheduledTask(){
            @Override
            protected void onPostExecute(String s) {
                Log.d("JobDispatcher", "PostExecute");
                Toast.makeText(getApplicationContext(), "Message from back task = "+s, Toast.LENGTH_LONG).show();
                jobFinished(jobParameters, false);
            }
        };
        backgroundScheduledTask.execute();
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {
        return false;
    }

    public static class BackgroundScheduledTask extends AsyncTask<Void, Void, String>{

        @Override
        protected String doInBackground(Void... params) {
            Log.d("JobDispatcher", "In background");
            return "Hello from background Job";
        }
    }
}

Манифест

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service android:name=".MyFirebaseJobScheduler"
        android:exported="false">
        <intent-filter>
            <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
        </intent-filter>
    </service>
</application>

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "26.0.2"

    defaultConfig {
        applicationId "com.cyclon.server"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.firebase:firebase-jobdispatcher:0.5.2'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
}

person Double_M    schedule 11.04.2018    source источник


Ответы (2)


Вы установили .setConstraints(Constraint.ON_ANY_NETWORK), что означает Требуется подключение к сети. Если вы хотите запустить службу без подключения к Интернету, вам нужно удалить .setConstraints(Constraint.ON_ANY_NETWORK) при планировании задания.

person immodi    schedule 12.04.2018
comment
Большое спасибо за ваш ответ. Но сначала я запустил код без этого ограничения, а когда это не сработало, я добавил их, чтобы посмотреть, сработает ли это. - person Double_M; 12.04.2018
comment
И обратите внимание, код работает нормально на эмуляторе Android Studio. На эмуляторе запланировано задание, и отображается тост, однако, когда я пытаюсь запустить его на своем мобильном телефоне, он вообще не вызывает класс обслуживания заданий. Я даже пытался использовать другой телефон, и он делает то же самое, я не знаю, есть ли требования, которым должен соответствовать телефон, чтобы диспетчер заданий firebase планировал задание. - person Double_M; 12.04.2018
comment
убедитесь, что на вашем устройстве обновлены сервисы Google Play, и планировщик повторяющихся заданий сработает в течение 60 секунд. - person immodi; 12.04.2018
comment
Позвольте мне попробовать это. Спасибо - person Double_M; 14.04.2018
comment
Я пробовал, все равно не работает. Я скачал сервис Google Play версии 12.2.17. - person Double_M; 17.04.2018
comment
Это может помочь вам http://blogs.quovantis.com/how-to-schedule-jobs-in-android-using-firebase-job-dispatcher/ - person immodi; 17.04.2018

В случае, если это будет кому-то полезно, в дополнение ко всем другим предыдущим ответам ниже, я сообщаю о том, что я испытал: для той же проблемы, с совершенно той же структурой кода, в моем случае это было решено путем изменения версии lib firebase, импортированный в build.gradle, в недавний. У меня было: реализация «com.firebase: firebase-jobdispatcher: 0.5.0», а затем я поставил: реализация «com.firebase: firebase-jobdispatcher: 0.8.5», возможно, более поздняя версия будет такой же.

person android_dev71    schedule 18.07.2019