Wenn Sie unter Android im Hintergrund verarbeiten möchten, verwenden Sie den Dienst. Lassen Sie uns den Service untersuchen und einen einfachen Beispielcode erstellen.
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.
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.
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.
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.
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);
//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);
}
});
}
}
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;
}
}
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).
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