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
에서 그렇게 할 수 있습니다. 물론, 당신은 그것에 국한되지 않습니다. 다음은 Activity
클래스에서 새 Service
를 소환하는 방법의 예입니다.
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
가 서로 충돌할지 걱정하지 않고 보낼 수 있습니다. 한 번에 하나의 인 Intent
만 처리되고 나머지는 대기열에 있습니다. 모든 작업이 완료되면 IntentService
가 자동으로 종료됩니다.
기본 IntentService 예제
추상 클래스 IntentService
는 사용자 인터페이스없이 백그라운드에서 실행되는 서비스의 기본 클래스입니다. 따라서 UI를 업데이트하려면 수신기 ( BroadcastReceiver
또는 ResultReceiver
중 하나 일 수 있음)를 ResultReceiver
.
- 서비스가 통신을 청취하려는 여러 구성 요소와 통신해야하는 경우
BroadcastReceiver
사용해야합니다. -
ResultReceiver
: 귀하의 서비스가 상위 어플리케이션 (예 : 어플리케이션)과 통신해야하는 경우 사용해야합니다.
IntentService
내에는 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()
메서드에서 제약 조건을 처리하는 방법을 보여줍니다.