[JAVA] Essayez d'utiliser le service sur Android Oreo

Au début

Sur Android, si vous souhaitez traiter en arrière-plan, vous utiliserez le service. Explorons le service et créons un exemple de code simple.

Format de service

Il existe deux types de services, avec des méthodes d'appel différentes.

・ Service démarré Commencez par startService (). Le service démarré continuera à fonctionner jusqu'à ce qu'il soit arrêté. Il ne renvoie pas le résultat à l'appelant, il fait juste le travail.

· Service lié Liez avec bindService (). Vous pouvez contrôler le service lié, comme l'envoi de demandes et l'obtention de résultats. Cependant, lorsque l'activité d'appel se termine, elle se termine en même temps.

Méthode de rappel de service

onCreate() Puisqu'il est appelé une fois au début, il sera initialisé. onStartCommand() Écrivez le processus à exécuter par le service. onDestroy() Traitement de la résiliation du service onBind() Si vous l'appelez avec bindService (), vous pouvez l'appeler.

Services sur Android Oreo

Limite d'exécution en arrière-plan Des restrictions ont été ajoutées au traitement en arrière-plan depuis Android Oreo (8.0 / API niveau 26). Par conséquent, le nouveau startForegroundService () remplace le startService ci-dessus Est utilisé. (En fait, il est nécessaire de séparer le traitement selon la version du SDK)

Il y avait diverses spécifications lors de l'utilisation de startForegroundService (). Démontrez les restrictions de service en arrière-plan d'Android O. Les cas d'utilisation sont résumés ici d'une manière facile à comprendre, je l'ai donc utilisé comme référence.

La source

Appuyez sur le bouton de démarrage pour démarrer le service et sur le bouton d'arrêt pour arrêter le service. Étant donné que le journal est généré 10 secondes après le démarrage du service, essayez de vérifier en mettant l'application en arrière-plan avant cela.

Classe de service ajoutée au manifeste

AndroidManifest.xml


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

MainActivity (paramètres des boutons uniquement)

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

        //Début du service
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent serviceIntent = new Intent(getApplication(), TestService.class);
                startForegroundService(serviceIntent);
            }
        });

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

Classe de service

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

        //Paramètres de notification
        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();

            //Courir au premier plan
            startForeground(1, notification);

            //Sortie de journal après 10 secondes
            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;
    }
}

Où j'étais accro

Un événement s'est produit dans lequel des plantages se sont produits à plusieurs reprises lors du démarrage du service. Quand je l'ai recherché, cela a été causé par le réglage de la notification passée à l'argument avec startForeground (). Dans Android 8.0, il semble que vous ne devriez pas spécifier d'icône adaptative avec Notification.setSmallIcon (). Je me suis écrasé avec R.mipmap.ic_launcher. Il est modifié pour spécifier une image appropriée à éviter. L'interface utilisateur système se bloque lors de l'affichage des notifications sur Android 8.0 (https://qiita.com/kawmra/items/9d80f15ea906f703d0d3)

Résumé

J'ai essayé de vérifier facilement le mouvement du service. (La méthode de vérification n'était pas très claire, mais ...) La méthode de mise en œuvre diffère selon la version et il existe diverses restrictions, il semble donc qu'une étude plus approfondie soit nécessaire pour en faire bon usage.

Ce qui suit est un site de référence. Comment utiliser le service [Android] Android Oreo: notifications et services de premier plan (https://rakuishi.com/archives/android-oreo-notification-foreground/) Services | Développeurs Android

Recommended Posts

Essayez d'utiliser le service sur Android Oreo
Essayez d'utiliser l'API Emotion d'Android
Essayez la communication en utilisant gRPC sur un serveur Android + Java
Essayez la classification d'image à l'aide de TensorFlow Lite sur Android (JAVA)
Essayez d'utiliser l'attribut de requête Ruby on Rails
Essayez de lancer un serveur WebAP sur le micro à l'aide d'Helidon
Essayez Redmine sur le docker Mac
[Android] Obtenez la date du lundi
Enregistrer ArrayList à l'aide de GSON sur Android
Essayez d'utiliser le système de messagerie Pulsar
Essayez d'utiliser la fonction de mesure en deux points de Firebase Performance Monitoring. [Android]
Essayez d'utiliser || au lieu de l'opérateur ternaire
Essayez d'utiliser l'API Stream en Java
Filtre Sobel utilisant OpenCV sur Android (Java)
Essayez d'appeler le service CORBA sur Java 11+
Essayez Health Check sur Azure App Service.
Essayez d'utiliser la télécommande Wii en Java
[Android] Comment activer / désactiver le panneau de notification à l'aide de StatusBarManager
Essayez d'utiliser libGDX
Utilisez des modèles sur le chemin de classe avec Apache Velocity
[Android] Obtenez la position tapée (coordonnées) sur l'écran
Essayez d'utiliser Maven
Essayez d'utiliser powermock-mockito2-2.0.2
Essayez d'utiliser GraalVM
[Android] Liste tous les éléments de réglage sur l'écran de réglage
Essayez d'utiliser jmockit 1.48
Essayez Azure Service Fabric (Java) sur un environnement Mac-Local
Les débutants essaient d'utiliser Android Studio Partie 2 (traitement des événements)
Essayez d'appeler le service CORBA depuis Spring (Java)
Les débutants essaient d'utiliser Android Studio Partie 1 (Hello World)
Essayez d'accéder à l'ensemble de données depuis Java en utilisant JZOS
Essayez d'utiliser SwiftLint
Essayez d'utiliser Log4j 2.0
Traduire à l'aide de l'API Microsoft Translator Text sur Android ~ Implémentation ~
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Utilisation de Java 8 avec Bluemix (sur Liberty Runtime & DevOps Service)
[Android] Solution lorsque l'appareil photo ne peut pas être démarré sur Android 9
Essayez d'implémenter le tamis Eratostenes en utilisant la bibliothèque standard de Java
Déployer des applications Java sur le service IBM Cloud Kubernetes
[Android] Afficher les images et les caractères dans l'onglet ViewPager
[Introduction] Affichez Android Studio Hello World sur l'émulateur
Essayez le hooking global en Java à l'aide de la bibliothèque JNativeHook
Limiter le nombre de threads à l'aide du service d'exécution de Java
Commande pour essayer d'utiliser Docker pour le moment
Je souhaite simplifier la sortie du journal sur Android
Jusqu'à ce que l'exemple de l'Assistant Google s'exécute sur Android Things
Essayez d'utiliser le Framework Axon
Essayez d'utiliser l'API REST de JobScheduler
Essayez DisplayLink sur Ubuntu 20.04
Essayez d'utiliser la méthode java.lang.Math
Essayez d'utiliser la WhiteBox de PowerMock
Essayez OpenLiteSpeed sur CentOS8