Domanda JobIntentService personalizzato onHandleWork non chiamato


Recentemente ho aggiornato un'app su cui lavoro per gestire le notifiche da push utilizzando un JobIntentService anziché un IntentService regolare perché sembra il modo corretto di gestirlo sui dispositivi pre-lollipop e sul post. Sto accodando il lavoro in quanto tale:

enqueueWork(context, MyJobServiceExtension.class, JOB_ID, work);

Questa è la dichiarazione manifest:

<service android:name="com.example.MyJobServiceExtension" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" tools:node="replace">

Non vedo mai alcun callback in onHandleWork o nessun registro degli errori nel mio logcat. Qualcuno ha integrato con successo questo che potrebbe aiutare?

Aggiornamento: l'ho provato su un dispositivo api 21 e funzionava .. ma non sembra essere chiamato sul mio dispositivo Android O pixel XL. Qualche indizio sul perché?

Aggiornamento n. 2: Mi sembra di vedere anche il nome onCreate di intentservice, ma nessuno degli altri metodi del ciclo di vita (incluso onHandleWork). Qualcuno ha mai incontrato questo?


15
2017-09-12 00:56


origine


risposte:


Ho avuto lo stesso problema dopo l'aggiornamento da IntentService a JobIntentService. Assicurati di rimuovere questo metodo dalla vecchia implementazione:

@Override
public IBinder onBind(Intent intent) {
    return null;
}

Per me questo ha risolto il problema, e ora funziona sia su Pre e post Oreo.


18
2017-09-16 15:29



Ho avuto lo stesso problema (ha funzionato bene su un dispositivo pre-O, senza alcuna indicazione di qualcosa che possa accadere su un dispositivo O). Oggi, ho provato di nuovo con lo stesso codice di ieri, ora funziona - l'unica differenza è che ho riavviato il dispositivo in mezzo.

La mia teoria attuale è che la mia configurazione iniziale non ha funzionato; il mio attuale si limita a ridistribuire il nuovo codice non cancella lo stato non funzionante da JobScheduler; un riavvio o una disinstallazione / reinstallazione del pacchetto.

La configurazione che sta funzionando ora (migrata da un ex IntentService):

<service
    android:name=".MyJobIntentService"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE"/>

e inizia con

Intent intent = new Intent(); 
intent.putExtra(EXTRA_NAME, extraValue);
JobIntentService.enqueueWork(context, MyJobIntentService.class, FIXED_JOB_ID, intent);

Si noti che l'intento è non un intento esplicito (cioè, ComponentName non è impostato).


4
2017-09-13 08:39



Questo è ciò che ha funzionato per me,

Rimuovi il IBind Override come suggerito da @agirardello

e ha aggiunto il seguente

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

Non ho idea del perché questo ha funzionato.


1
2018-02-28 17:04



Per me stavo ancora avviando il servizio dopo enqueueWork e mi stavo dando errore a causa di ciò.


0
2017-09-26 20:14



Mi sono imbattuto in questo problema cercando di accodare il JobIntentService utilizzando JobScheduler. Mentre JobScheduler ha il proprio metodo enqueueWork (), non funziona con JobIntentService. Il servizio verrà avviato ma onHandleWork () non viene mai chiamato.

Ha iniziato a funzionare di nuovo quando ho usato il metodo static enqueueWork () che si trova su JobIntentService, ad esempio:

MyJobIntentService.enqueueWork(context, ...) 

Niente di tutto questo era ovvio dalla lettura di javadoc di Android.


0
2017-10-18 01:04