web-dev-qa-db-fra.com

Démarrer un service d'arrière-plan au démarrage à Oreo

J'ai un cas d'utilisation très spécifique. Je dois démarrer un service d'arrière-plan qui exécute un serveur Web au démarrage d'Android 8. Quelqu'un peut-il recommander un moyen d'y parvenir? (Sous Android O).

Il semble que vous ne puissiez plus démarrer un service d'arrière-plan au démarrage ... Y a-t-il un autre moyen de le faire? JobService ou l'exécution d'un service de premier plan? Mon code fonctionne sur Android en dessous de 8 mais ne semble pas fonctionner sur O.

Manifeste:

<receiver Android:name=".ServiceStarter" Android:enabled="true">
    <intent-filter>
        <action Android:name="Android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>

ServiceStarter (extends BroadcastReceiver):

@Override
public void onReceive(Context context, Intent intent) {
    HTTPServerService.startService(context);
}

HTTPServerService.startService ()

context.startService(new Intent(context, HTTPServerService.class));

J'ai examiné d'autres questions similaires, mais aucune ne semble répondre à mon problème spécifique. J'apprécie tous les indicateurs.

4
lsrom

Réponse 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(new Intent(context, HTTPServerService.class));
} else {
    context.startService(new Intent(context, HTTPServerService.class));
}
2
user924

Vous devez utiliser JobIntentService au lieu du service habituel.

https://developer.Android.com/reference/Android/support/v4/app/JobIntentService.html

0
user8884234

JobIntentService travaille dans 6 également j'ai testé.S'il vous plaît appelez le service comme ci-dessous

        Intent intent = new Intent(context, UploadService.class);
        intent.putExtra(Constants.JOB_ID, ID);
        UploadService.enqueueWork(context, intent);

Et dans UploadService utilisez le code ci-dessous

 public static void enqueueWork(Context context, Intent work) {
     enqueueWork(context,UploadService.class,JOB_ID, work);
}

Assurez-vous que le nom de la classe doit être identique dans enqueueWork method

0
Android dev