Поиск…


Синтаксис

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

замечания

IntentService предоставляет простой способ разгрузить работу в фоновом потоке. Он обрабатывает все о получении запросов, помещает их в очередь, останавливает себя и т. Д. Для вас. Его также легко реализовать, что делает его идеальным для использования, когда у вас есть трудоемкие операции, которые не входят в поток Main (UI).

Создание IntentService

Чтобы создать IntentService, создайте класс, который расширяет IntentService и внутри него, метод, который переопределяет 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.
     }
}

Образец Намерения

Вот пример IntentService который претендует на загрузку изображений в фоновом режиме. Все, что вам нужно сделать для реализации IntentService - это предоставить конструктор, который вызывает конструктор super(String) , и вам нужно реализовать метод 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
    }
}

Чтобы запустить IntentService , вам необходимо отправить Intent . Вы можете сделать это из Activity , например. Конечно, вы не ограничиваетесь этим. Ниже приведен пример того, как вы вызовите новую Service из класса 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

IntentService обрабатывает данные из своего Intent , так что вы можете отправлять несколько Intent s, не беспокоясь о том, столкнутся ли они друг с другом. Intent обрабатывается только одно Intent , остальные идут в очередь. Когда все задания будут завершены, IntentService автоматически отключится.

Основной пример IntentService

Абстрактный класс IntentService является базовым классом для сервисов, которые работают в фоновом режиме без какого-либо пользовательского интерфейса. Поэтому, чтобы обновить пользовательский интерфейс, мы должны использовать приемник, который может быть либо BroadcastReceiver либо ResultReceiver :

  • BroadcastReceiver следует использовать, если вашему сервису необходимо обмениваться данными с несколькими компонентами, которые хотят прослушивать связь.
  • ResultReceiver : должен использоваться, если вашему сервису необходимо связываться только с родительским приложением (т. ResultReceiver вашим приложением).

В IntentService у нас есть один ключевой метод onHandleIntent() , в котором мы будем делать все действия, например, подготовку уведомлений, создание аварийных сигналов и т. Д.

Если вы хотите использовать собственный IntentService , вы должны расширить его следующим образом:

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

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

Вызов / запуск активности можно выполнить следующим образом:

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

Подобно любой деятельности, вы можете передать дополнительную информацию, такую ​​как данные пакета, следующим образом:

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

Теперь предположим, что мы передали некоторые данные в класс YourIntentService . Исходя из этих данных, действие может быть выполнено следующим образом:

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.
        }    
    }
}

В приведенном выше коде также показано, как обрабатывать ограничения в OnHandleIntent() .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow