[JAVA] Versuchen Sie, den Dienst auf Android Oreo zu verwenden

Am Anfang

Wenn Sie unter Android im Hintergrund verarbeiten möchten, verwenden Sie den Dienst. Lassen Sie uns den Service untersuchen und einen einfachen Beispielcode erstellen.

Format des Dienstes

Es gibt zwei Arten von Diensten mit unterschiedlichen Methoden zum Aufrufen.

・ Dienst gestartet Beginnen Sie mit startService (). Der gestartete Dienst funktioniert weiter, bis er gestoppt wird. Das Ergebnis wird nicht an den Anrufer zurückgegeben, sondern nur erledigt.

· Gebundener Service Mit bindService () binden. Sie können den gebundenen Dienst steuern, z. B. das Senden von Anforderungen und das Abrufen von Ergebnissen. Wenn die aufrufende Aktivität jedoch endet, endet sie gleichzeitig.

Service-Rückrufmethode

onCreate() Da es zu Beginn einmal aufgerufen wird, wird es initialisiert. onStartCommand() Schreiben Sie den vom Dienst auszuführenden Prozess. onDestroy() Verarbeitung der Dienstbeendigung onBind() Wenn Sie es mit "bindService ()" aufrufen, können Sie es aufrufen.

Dienste auf Android Oreo

Hintergrundausführungslimit Der Hintergrundverarbeitung von Android Oreo (8.0 / API Level 26) wurden Einschränkungen hinzugefügt. Daher ersetzt der neu eingeführte "startForegroundService ()" den obigen "startService" Wird genutzt. (Eigentlich ist es notwendig, die Verarbeitung nach der SDK-Version zu trennen)

Bei der Verwendung von startForegroundService () gab es verschiedene Spezifikationen. Demonstrieren Sie Einschränkungen für Hintergrunddienste von Android O. Die Anwendungsfälle sind hier leicht verständlich zusammengefasst, daher habe ich sie als Referenz verwendet.

Quelle

Drücken Sie die Starttaste, um den Dienst zu starten, und die Stopptaste, um den Dienst zu beenden. Das Protokoll wird 10 Sekunden nach dem Start des Dienstes ausgegeben. Versuchen Sie daher zuvor, die App in den Hintergrund zu stellen, um sie zu überprüfen.

Serviceklasse zu Manifest hinzugefügt

AndroidManifest.xml


<service android:name=".TestService"/>

MainActivity (nur Tasteneinstellungen)

MainActivity.java


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button startButton = findViewById(R.id.button_start);
        Button stopButton = findViewById(R.id.button_stop);

        //Start des Dienstes
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent serviceIntent = new Intent(getApplication(), TestService.class);
                startForegroundService(serviceIntent);
            }
        });

        //Dienstausfall
        stopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent serviceIntent = new Intent(getApplication(), TestService.class);
                stopService(serviceIntent);
            }
        });
    }
}

Serviceklasse

TestService.java


public class TestService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("DEBUG", "called TestService.onCreate()");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("DEBUG", "called TestService.onStartCommand()");
        String channelId = "service";
        String title = "TestService";

        //Benachrichtigungseinstellungen
        NotificationManager notificationManager =
                (NotificationManager)getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationChannel channel =
                new NotificationChannel(channelId, title, NotificationManager.IMPORTANCE_DEFAULT);

        if(notificationManager != null) {
            notificationManager.createNotificationChannel(channel);
            Notification notification = new Notification.Builder(getApplicationContext(), channelId)
                    .setContentTitle(title)
                    .setSmallIcon(R.drawable.menu)
                    .setContentText("service start")
                    .build();

            //Laufen Sie im Vordergrund
            startForeground(1, notification);

            //Protokollausgabe nach 10 Sekunden
            try {
                Thread.sleep(10000);
                Log.i("INFO", "processing service");
            } catch (InterruptedException e) {
                e.printStackTrace();

            }
        }

        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("DEBUG", "called TestService.onDestroy()");
    }

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

Wo ich süchtig war

Es ist ein Ereignis aufgetreten, bei dem beim Starten des Dienstes wiederholt Abstürze aufgetreten sind. Als ich es nachgeschlagen habe, wurde es durch die Einstellung der Benachrichtigung verursacht, die mit startForeground () an das Argument übergeben wurde. In Android 8.0 sollten Sie anscheinend kein adaptives Symbol mit "Notification.setSmallIcon ()" angeben. Ich bin mit R.mipmap.ic_launcher abgestürzt. Es wird geändert, um ein geeignetes Bild zur Vermeidung anzugeben. Die Benutzeroberfläche des Systems stürzt ab, wenn Benachrichtigungen unter Android 8.0 angezeigt werden (https://qiita.com/kawmra/items/9d80f15ea906f703d0d3).

Zusammenfassung

Ich habe versucht, die Bewegung des Dienstes leicht zu überprüfen. (Die Überprüfungsmethode war nicht sehr klar, aber ...) Die Implementierungsmethode unterscheidet sich je nach Version, und es gibt verschiedene Einschränkungen. Es scheint also, dass mehr Studien erforderlich sind, um sie gut zu nutzen.

Das Folgende ist eine Referenzseite. Verwendung des [Android] -Dienstes Android Oreo: Benachrichtigungen und Dienste im Vordergrund (https://rakuishi.com/archives/android-oreo-notification-foreground/) Dienste | Android-Entwickler

Recommended Posts

Versuchen Sie, den Dienst auf Android Oreo zu verwenden
Versuchen Sie es mit der Emotion API von Android
Versuchen Sie die Kommunikation mit gRPC auf einem Android + Java-Server
Versuchen Sie die Bildklassifizierung mit TensorFlow Lite unter Android (JAVA).
Versuchen Sie es mit dem Ruby on Rails-Abfrageattribut
Versuchen Sie, mit Helidon einen WebAP-Server auf dem Mikro zu starten
Probieren Sie Redmine auf dem Mac Docker aus
[Android] Holen Sie sich das Datum von Montag
Speichern Sie ArrayList mit GSON unter Android
Versuchen Sie es mit dem Nachrichtensystem Pulsar
Versuchen Sie es mit der Zweipunktmessfunktion von Firebase Performance Monitoring. [Android]
Versuchen Sie, || anstelle des ternären Operators zu verwenden
Versuchen Sie es mit der Stream-API in Java
Sobel-Filter mit OpenCV unter Android (Java)
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Versuchen Sie Health Check für Azure App Service.
Versuchen Sie es mit der Wii-Fernbedienung in Java
[Android] So aktivieren / deaktivieren Sie das Benachrichtigungsfeld mit StatusBarManager
Versuchen Sie es mit libGDX
Verwenden Sie Vorlagen für den Klassenpfad mit Apache Velocity
[Android] Ermittelt die getippte Position (Koordinaten) auf dem Bildschirm
Versuchen Sie es mit Maven
Versuchen Sie es mit powermock-mockito2-2.0.2
Versuchen Sie es mit GraalVM
[Android] Listet alle Einstellungselemente auf dem Einstellungsbildschirm auf
Versuchen Sie es mit jmockit 1.48
Probieren Sie Azure Service Fabric (Java) in einer Mac-Local-Umgebung aus
Anfänger versuchen Android Studio Teil 2 (Ereignisverarbeitung)
Versuchen Sie, den CORBA-Dienst von Spring (Java) aus aufzurufen.
Anfänger versuchen Android Studio Teil 1 (Hello World)
Versuchen Sie, mit JZOS von Java aus auf das Dataset zuzugreifen
Versuchen Sie es mit SwiftLint
Versuchen Sie es mit Log4j 2.0
Übersetzen Sie mit der Microsoft Translator Text API unter Android ~ Implementierung ~
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Verwenden von Java 8 mit Bluemix (auf Liberty Runtime & DevOps Service)
[Android] Lösung, wenn die Kamera unter Android 9 nicht gestartet werden kann
Versuchen Sie, das Eratostenes-Sieb mithilfe der Java-Standardbibliothek zu implementieren
Stellen Sie Java-Apps auf dem IBM Cloud Kubernetes-Dienst bereit
[Android] Zeigen Sie Bilder und Zeichen auf der Registerkarte ViewPager an
[Einführung] Zeigen Sie Android Studio Hello World auf dem Emulator an
Versuchen Sie es mit globalem Hooking in Java mithilfe der JNativeHook-Bibliothek
Begrenzen Sie die Anzahl der Threads mithilfe des Java Executor Service
Befehl, um Docker vorerst zu verwenden
Ich möchte die Protokollausgabe unter Android vereinfachen
Bis das Google Assistant-Beispiel auf Android Things ausgeführt wird
Versuchen Sie es mit dem Axon Framework
Versuchen Sie es mit der REST-API von JobScheduler
Probieren Sie DisplayLink unter Ubuntu 20.04 aus
Versuchen Sie es mit der Methode java.lang.Math
Versuchen Sie es mit der WhiteBox von PowerMock
Probieren Sie OpenLiteSpeed unter CentOS8 aus