webentwicklung-frage-antwort-db.com.de

Starten Sie beim Booten in Oreo einen Hintergrunddienst

Ich habe einen ganz bestimmten Anwendungsfall. Ich muss einen Hintergrunddienst starten, der beim Booten in Android 8 einen Webserver ausführt. Kann jemand einen Weg empfehlen, um dies zu erreichen? (In Android O).

Es scheint, dass Sie beim Booten keinen Hintergrundservice mehr starten können. Gibt es eine andere Möglichkeit, dies zu tun? JobService oder stattdessen einen Vordergrunddienst ausführen? Mein Code funktioniert auf Android unter 8, aber es scheint nicht auf O zu funktionieren.

Manifest:

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

Ich habe andere ähnliche Fragen angeschaut, aber keine scheint mein spezifisches Problem zu beantworten. Ich schätze alle Hinweise.

4
lsrom

Antworten 

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

Sie müssen JobIntentService anstelle des regulären Dienstes verwenden.

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

0
user8884234

JobIntentService arbeitet auch in 6 und ich habe es getestet. Bitte rufen Sie den Service wie unten beschrieben an

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

Und in UploadService verwenden Sie den folgenden Code

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

Stellen Sie sicher, dass der Klassenname in der Methode enqueueWork identisch sein muss

0
Android dev