java - Nougat - JobScheduler RESULT_SUCCESS 但作业没有输出

标签 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 = 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");

我得到输出“服务正在运行”,但没有得到“服务已启动”。并且应用程序也没有接收服务应该发送的广播。

这一切在 Android 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>

请下载this示例并从那里导入NotificationScheduler新项目并检查它。请相应地更改您的项目。

我注意到的:

  1. list 条目是:

        android:name=".mService"
        android:permission="android.permission.BIND_JOB_SERVICE"
        ></service>
    
  2. 作业调度程序:

    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);
    

请注意,这里对Periodic min Interval有一个限制,不幸的是它是15分钟,当我们将其设置得更小时,SDK将其更改为15分钟,并且还将Flex间隔设置为5分钟,最后我们得到服务在作业调度时间大约 7-8 分钟后开始。就是这样)。

这对我有用,

祝你好运)

关于java - Nougat - JobScheduler RESULT_SUCCESS 但作业没有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52424400/

相关文章:

android - Gradle插件3.6.1,分发URL版本5.6.4中的Gradle构建错误

java - 如何像spring security一样创建安全注解

android - 从桌面无线上传并在手机上启动 apk 以进行开发

java - 向下滚动时 ListView 图标出现在错误的行中

java - 操作栏消失了

android - 无法在 Android Studio 1.3 中将 gradle 插件更新为 1.3.0-beta4

JavaBean类规则

java - JPQL - ManyToMany self 引用

java - 以编程方式启动和停止 Spring Integration 中的某些 IntegrationFlows?

android - 如何在 Android Studio 3+ 上更改项目名称