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.
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.
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.
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.
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.
AndroidManifest.xml
<service android:name=".TestService"/>
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);
}
});
}
}
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;
}
}
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)
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