Szukaj…


Składnia

  1. <service android: name = ". UploadS3IntentService" android: exported = "false" />

Uwagi

Usługa IntentService zapewnia prosty sposób na odciążenie pracy w wątku w tle. Obsługuje wszystko dotyczące otrzymywania żądań, umieszczania ich w kolejce, zatrzymywania się itp. Dla Ciebie. Jest również łatwy do wdrożenia, dzięki czemu jest to idealna rzecz do użycia, gdy masz czasochłonne operacje, które nie należą do głównego wątku (UI).

Tworzenie usługi IntentService

Aby utworzyć IntentService, utwórz klasę, która rozszerza IntentService , aw jej ramach metodę, która zastępuje onHandleIntent :

package com.example.myapp;
public class MyIntentService extends IntentService {
    @Override
     protected void onHandleIntent (Intent workIntent) {
         //Do something in the background, based on the contents of workIntent.
     }
}

Przykładowa usługa zamiaru

Oto przykład usługi IntentService która udaje, że ładuje obrazy w tle. Wszystko, co musisz zrobić, aby wdrożyć IntentService to zapewnić konstruktor, który wywołuje konstruktor super(String) , i musisz zaimplementować onHandleIntent(Intent) .

public class ImageLoaderIntentService extends IntentService {

    public static final String IMAGE_URL = "url";

    /**
     * Define a constructor and call the super(String) constructor, in order to name the worker
     * thread - this is important if you want to debug and know the name of the thread upon 
     * which this Service is operating its jobs.
     */
    public ImageLoaderIntentService() {
        super("Example");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // This is where you do all your logic - this code is executed on a background thread

        String imageUrl = intent.getStringExtra(IMAGE_URL);

        if (!TextUtils.isEmpty(imageUrl)) {
            Drawable image = HttpUtils.loadImage(imageUrl); // HttpUtils is made-up for the example
        }

        // Send your drawable back to the UI now, so that you can use it - there are many ways
        // to achieve this, but they are out of reach for this example
    }
}

Aby rozpocząć IntentService , musisz wysłać do niej Intent . Można to zrobić z Activity , na przykład. Oczywiście nie jesteś do tego ograniczony. Oto przykład, w jaki sposób wezwałbyś nową Service z klasy Activity .

Intent serviceIntent = new Intent(this, ImageLoaderIntentService.class); // you can use 'this' as the first parameter if your class is a Context (i.e. an Activity, another Service, etc.), otherwise, supply the context differently
serviceIntent.putExtra(IMAGE_URL, "http://www.example-site.org/some/path/to/an/image");
startService(serviceIntent); // if you are not using 'this' in the first line, you also have to put the call to the Context object before startService(Intent) here

Usługa IntentService przetwarza dane ze swoich Intent sekwencyjnie, dzięki czemu można wysyłać wiele Intent bez obawy, czy kolidują one ze sobą. Przetwarzany jest tylko jeden Intent na raz, reszta idzie w kolejce. Po zakończeniu wszystkich zadań IntentService wyłączy się automatycznie.

Podstawowy przykład usługi IntentService

Klasa abstrakcyjna IntentService jest klasą bazową dla usług, które działają w tle bez interfejsu użytkownika. Dlatego w celu zaktualizowania interfejsu użytkownika musimy skorzystać z odbiornika, którym może być BroadcastReceiver lub ResultReceiver :

  • BroadcastReceiver należy używać, jeśli usługa wymaga komunikacji z wieloma komponentami, które chcą nasłuchiwać.
  • ResultReceiver : należy użyć, jeśli usługa musi komunikować się tylko z aplikacją nadrzędną (tj. Aplikacją).

W ramach usługi IntentService mamy jedną kluczową metodę onHandleIntent() , w której onHandleIntent() wszystkie czynności, na przykład przygotowując powiadomienia, tworząc alarmy itp.

Jeśli chcesz korzystać z własnej usługi IntentService , musisz ją rozszerzyć w następujący sposób:

public class YourIntentService extends IntentService {
    public YourIntentService () {
        super("YourIntentService ");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // TODO: Write your own code here.
    }
}    

Wywołanie / rozpoczęcie działania można wykonać w następujący sposób:

Intent i = new Intent(this, YourIntentService.class);
startService(i);  // For the service.
startActivity(i); // For the activity; ignore this for now.

Podobnie jak w przypadku każdej aktywności, możesz przekazać do niej dodatkowe informacje, takie jak pakiet danych:

Intent passDataIntent = new Intent(this, YourIntentService.class);
msgIntent.putExtra("foo","bar");
startService(passDataIntent);

Załóżmy teraz, że przekazaliśmy pewne dane do klasy YourIntentService . Na podstawie tych danych można wykonać akcję w następujący sposób:

public class YourIntentService extends IntentService {
    private String actvityValue="bar";
    String retrivedValue=intent.getStringExtra("foo");

    public YourIntentService () {
        super("YourIntentService ");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if(retrivedValue.equals(actvityValue)){
            // Send the notification to foo.
        } else {
            // Retrieving data failed.
        }    
    }
}

Powyższy kod pokazuje również, jak obsługiwać ograniczenia w OnHandleIntent() .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow