Java 牛轧糖-JobScheduler结果\u成功,但没有来自作业的输出

Java 牛轧糖-JobScheduler结果\u成功,但没有来自作业的输出,java,android,android-studio,android-studio-3.0,Java,Android,Android Studio,Android Studio 3.0,我开始这样的工作: JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE); if(scheduler.getPendingJob(JOB_NUMBER) == null) { ComponentName componentName = new ComponentName(this, mService.class); JobInfo info = n

我开始这样的工作:

JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);

    if(scheduler.getPendingJob(JOB_NUMBER) == null) {

        ComponentName componentName = new ComponentName(this, mService.class);
        JobInfo info = new JobInfo.Builder(JOB_NUMBER, componentName)
                .setRequiresCharging(false)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
                .setPersisted(true)
                .setPeriodic(60 * 60 * 1000)
                .build();

        int resultCode = scheduler.schedule(info);
        if (resultCode == JobScheduler.RESULT_SUCCESS) {
            Log.d(TAG, "Service is not running, Job " + String.valueOf(JOB_NUMBER) + " Scheduled.");
        } else {
            Log.d(TAG, "Service is not running, However job scheduling failed.");
        }

    } else{
        Log.d(TAG, "Service is already scheduled.");
    }
在服务中:

@Override
public boolean onStartJob(JobParameters jobParameters) {

    Log.d("Service", "v1.2 Started");
我得到的输出是“服务正在运行”,但不是“服务已启动”。应用程序也没有收到服务应该发送的广播

这一切在安卓8中都能完美运行,但在安卓7中却不行

编辑:我猜服务一定在运行,因为当我关闭并重新启动应用程序时,我会收到消息“服务已安排”。那么,为什么我看不到我的服务的任何日志输出呢?在牛轧糖中,它会像奥利奥一样直接流出吗?或者我必须等一个小时才能开始吗?

请尝试以下方法:

// the service class

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.util.Log;

/**
 * JobService to be scheduled by the JobScheduler.
 * start another service
 */
public class mService extends JobService {
    private static final String TAG = "SyncService";

    @Override
    public boolean onStartJob(JobParameters params) {
        Log.d("TAG", "onStartJobb");
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.d("TAG", "onStopJob");
        return true;
    }
}


// in main activity

@RequiresApi(api = Build.VERSION_CODES.N)
public void onResume(){
    super.onResume();

    JobScheduler scheduler = getSystemService(JobScheduler.class);

    if(scheduler.getPendingJob(1) == null) {

        ComponentName componentName = new ComponentName(this, mService.class);
        //JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
        JobInfo.Builder info = new JobInfo.Builder(1, componentName)
                .setRequiresCharging(false)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
                .setPersisted(true)
                .setMinimumLatency(1 * 1000)
                .setOverrideDeadline(3 * 1000)
                //.setPeriodic(60 * 60 * 1000)
                //.build()
                ;

        int resultCode = scheduler.schedule(info.build());
        if (resultCode == JobScheduler.RESULT_SUCCESS) {
            Log.d("TAG", "Service is not running, Job " + String.valueOf(1) + " Scheduled.");
        } else {
            Log.d("TAG", "Service is not running, However job scheduling failed.");
        }

    } else{
        Log.d("TAG", "Service is already scheduled.");
    }
}

    // and in manifest

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <service
        android:name=".mService"
        android:enabled="true"
        android:exported="true"
        android:label="Word service"
        android:permission="android.permission.BIND_JOB_SERVICE">
    </service>
请注意,这里有一个对周期性最小间隔的限制,不幸的是,它是15分钟,当我们将其设置得更小时,SDK将其更改为15分钟,并将弹性间隔设置为5分钟,最后,我们在作业调度时间约7-8分钟后启动服务。就是这样)

这对我有用

祝你好运)

请试试这个:

// the service class

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.util.Log;

/**
 * JobService to be scheduled by the JobScheduler.
 * start another service
 */
public class mService extends JobService {
    private static final String TAG = "SyncService";

    @Override
    public boolean onStartJob(JobParameters params) {
        Log.d("TAG", "onStartJobb");
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.d("TAG", "onStopJob");
        return true;
    }
}


// in main activity

@RequiresApi(api = Build.VERSION_CODES.N)
public void onResume(){
    super.onResume();

    JobScheduler scheduler = getSystemService(JobScheduler.class);

    if(scheduler.getPendingJob(1) == null) {

        ComponentName componentName = new ComponentName(this, mService.class);
        //JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
        JobInfo.Builder info = new JobInfo.Builder(1, componentName)
                .setRequiresCharging(false)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
                .setPersisted(true)
                .setMinimumLatency(1 * 1000)
                .setOverrideDeadline(3 * 1000)
                //.setPeriodic(60 * 60 * 1000)
                //.build()
                ;

        int resultCode = scheduler.schedule(info.build());
        if (resultCode == JobScheduler.RESULT_SUCCESS) {
            Log.d("TAG", "Service is not running, Job " + String.valueOf(1) + " Scheduled.");
        } else {
            Log.d("TAG", "Service is not running, However job scheduling failed.");
        }

    } else{
        Log.d("TAG", "Service is already scheduled.");
    }
}

    // and in manifest

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <service
        android:name=".mService"
        android:enabled="true"
        android:exported="true"
        android:label="Word service"
        android:permission="android.permission.BIND_JOB_SERVICE">
    </service>
请注意,这里有一个对周期性最小间隔的限制,不幸的是,它是15分钟,当我们将其设置得更小时,SDK将其更改为15分钟,并将弹性间隔设置为5分钟,最后,我们在作业调度时间约7-8分钟后启动服务。就是这样)

这对我有用


祝您好运)

请尝试设置.setPeriodic(20*1000)并等待20秒以进行设置ensure@HovanesMosoyan谢谢,我尝试了一下,但仍然没有输出。是的,我也尝试过),我认为有些权限我们不允许,我们应该对此进行研究,我尝试了一个全新的空白服务,我无法让它在v7中运行。新代码与上面的代码相同吗?请尝试设置.setPeriodic(20*1000)并等待20秒ensure@HovanesMosoyan谢谢,我试过了,但还是没有输出。是的,我也试过了),我想有些权限是我们不允许的,我们应该对此进行研究,我尝试了一个全新的空白服务,但无法在v7中运行。新代码与上面的代码相同吗?非常感谢您的帮助!!似乎唯一缺少的位是
setMinimumLatency
setOverrideDeadline
。我不知道为什么,但在安卓N中,出于某种原因,它们是必需的。我不记得在文档中的任何地方看到过。是的,设置截止日期并不是那么重要)虽然上面的代码确实起作用,但它没有将其设置为定期运行。请为迟交的答案感到抱歉,最后我得到了护目镜示例,请注意我答案中的更改。非常感谢您的帮助!!似乎唯一缺少的位是
setMinimumLatency
setOverrideDeadline
。我不知道为什么,但在安卓N中,出于某种原因,它们是必需的。我不记得在文档中的任何地方看到过。是的,设置截止日期并不是那么重要)虽然上面的代码确实起作用,但它没有将其设置为定期运行。请为迟交的答案感到抱歉,最后我得到了护目镜示例,请注意我答案中的更改。
ComponentName serviceName = new ComponentName(getPackageName(), mService.class.getName());

long min = JobInfo.getMinPeriodMillis();
JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, serviceName)
        .setRequiredNetworkType(NETWORK_TYPE_NONE)
        .setRequiresDeviceIdle(false)
        .setPeriodic(5000)
        .setRequiresCharging(false);
builder.setPeriodic(5 * 1000);

JobInfo myJobInfo = builder.build();
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(myJobInfo);