Работа службы не называется - PullRequest
0 голосов
/ 18 апреля 2020

Привет, я сослался на Планировщик заданий по этой ссылке . Когда я хочу запустить службу с помощью кнопки активности, служба не запускается. Я перечислил код. Может ли кто-нибудь помочь, если я ошибся?

MainActivity

  package com.example.samplejobscheduler;
import androidx.appcompat.app.AppCompatActivity;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.os.Bundle;
import android.util.Log;
import android.view.View; 

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
    public void scheduleJob(View v) {
    ComponentName componentName = new ComponentName(this, MySchedulerService.class);
    JobInfo info = new JobInfo.Builder(123, componentName)
            .setRequiresCharging(true)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
            .setPersisted(true)
            .setPeriodic(2 * 60 * 1000)
            .build();
    JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
    int resultCode = scheduler.schedule(info);
    if (resultCode == JobScheduler.RESULT_SUCCESS) {
        Log.d(TAG, "Job scheduled");
    } else {
        Log.d(TAG, "Job scheduling failed");
    }
}
public void cancelJob(View v) {
    JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
    scheduler.cancel(123);
    Log.d(TAG, "Job cancelled");
}}

MySchedulerService

public class MySchedulerService extends JobService {
private static final String TAG = "MySchedulerService";
private boolean jobCancelled = false;

@Override
public boolean onStartJob(JobParameters params) {
    Log.d(TAG, "Job started");
    doBackgroundWork(params);

    return true;
}

private void doBackgroundWork(final JobParameters params) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                Log.d(TAG, "run: " + i);
                if (jobCancelled) {
                    return;
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            Log.d(TAG, "Job finished");
            jobFinished(params, false);
        }
    }).start();
}

@Override
public boolean onStopJob(JobParameters params) {
    Log.d(TAG, "Job cancelled before completion");
    jobCancelled = true;
    return true;
}}

Activity_main

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:gravity="center"
    android:orientation="vertical"
    tools:context="com.example.samplejobscheduler.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="scheduleJob"
        android:text="Schedule Job" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="cancelJob"
        android:text="Cancel Job" />
</LinearLayout>

AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.samplejobscheduler">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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=".MySchedulerService"
            android:permission="android.permission.BIND_JOB_SERVICE" />
    </application>

</manifest>

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.1"

    defaultConfig {
        applicationId "com.example.samplejobscheduler"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}

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

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

После анализа вашего кода я предложу ..

.setRequiresCharging(true)

Поскольку вы установили требуемую зарядку true, служба будет работать только, если ваше устройство заряжается, если оно не заряжается, оно будет не запускается.

.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)

Поскольку вы установили вышеупомянутое условие, то ваша служба будет работать только в том случае, если ваше устройство подключено к Wi-Fi. Если ваше устройство подключено с помощью мобильного подключения для передачи данных, служба не будет работать. Если вы просто хотите, чтобы служба работала только тогда, когда inte rnet доступен, будь то данные для мобильных устройств или Wi-Fi, установите ниже условие

 .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)

Еще одна вещь: вы не добавили значение экспортированного флага в true для задание в манифесте, сделайте так, как показано ниже

    <service
        android:name=".MySchedulerService"
        android:exported="true"
        android:permission="android.permission.BIND_JOB_SERVICE" />
0 голосов
/ 18 апреля 2020

Убедитесь, что min SDK равен 21 или выше.

И в манифесте я не думаю, что вам нужно это разрешение:

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