Android
IntentService
Поиск…
Синтаксис
- <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()
.