先贴出官方关于IntentService的解释:
IntentService is a base class for Service
s that handle asynchronous requests (expressed as Intent
s) on demand. Clients send requests through startService(Intent)
calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.
This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent)
. IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.
All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.
我用我的渣渣英语初略翻译一下,也当是学习了啊-_-!。IntentService是一个用于处理异步请求的Service的子类(表现为Intent)。客户端通过调用startService(Intent)来发送请求。服务被开启,在工作线程中顺序的处理每一个Intent请求,当工作完成后它将自动停止自己。
“工作队列处理器”模式通常用于从一个程序的主线程卸载任务。IntentService就是为了简化这种模式和机制的。继承IntentService并实现onHandleIntent(Intent)方法就可以说使用它。IntentService将接收Intents,并载入到工作线程,然后运行结束后在一个适当的时间结束这个Service。
所有的请求都在一个单独的工作线程被处理--他们可能需要很长时间来处理(但并不会阻塞主线程的循环),但同一时刻仅有一个请求能被处理。
所以使用IntentService特别适合做网络下载的操作,它的特点包括onHandleIntent(Intent)方法运行在工作线程中不会阻塞主线程,处理结束后会自动结束自己,非常方便。具体关于它的介绍,大家可以看一下这篇文章。
这里我分析一个Demo,非常明确的解释它的使用方法:
- MainActivity
public class MainActivity extends AppCompatActivity {
private static final String ACTION_FOO = "com.example.hornsey.myapplication.IntentServiceDemo.action.FOO";
private static final String ACTION_BAZ = "com.example.hornsey.myapplication.IntentServiceDemo.action.BAZ";
private static final String EXTRA_PARAM1 = "Name";
private static final String EXTRA_PARAM2 = "Question";
private static final String EXTRA_PARAM3 = "Answer";
private static Context sContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sContext = MainActivity.this;
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActionFoo(sContext,"Jack","How are you?");
}
});
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActionBaz(sContext,"Tom","Fine!");
}
});
}
/**
* Starts this service to perform action Foo with the given parameters. If
* the service is already performing a task this action will be queued.
*
* @see IntentService
*/
public static void startActionFoo(Context context, String param1, String param2) {
Intent intent = new Intent(context, MyIntentService.class);
intent.setAction(ACTION_FOO);
intent.putExtra(EXTRA_PARAM1, param1);
intent.putExtra(EXTRA_PARAM2, param2);
context.startService(intent);
}
/**
* Starts this service to perform action Baz with the given parameters. If
* the service is already performing a task this action will be queued.
*
* @see IntentService
*/
public static void startActionBaz(Context context, String param1, String param2) {
Intent intent = new Intent(context, MyIntentService.class);
intent.setAction(ACTION_BAZ);
intent.putExtra(EXTRA_PARAM1, param1);
intent.putExtra(EXTRA_PARAM3, param2);
context.startService(intent);
}
- MyIntentService
public class MyIntentService extends IntentService {
private static final String TAG = "MyIntentService";
private static final String ACTION_FOO = "com.example.hornsey.myapplication.IntentServiceDemo.action.FOO";
private static final String ACTION_BAZ = "com.example.hornsey.myapplication.IntentServiceDemo.action.BAZ";
private static final String EXTRA_PARAM1 = "Name";
private static final String EXTRA_PARAM2 = "Question";
private static final String EXTRA_PARAM3 = "Answer";
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* String Used to name the worker thread, important only for debugging.
*/
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String action = intent.getAction();
if (action.equals(ACTION_FOO)) {
final String param1 = intent.getStringExtra(EXTRA_PARAM1);
final String param2 = intent.getStringExtra(EXTRA_PARAM2);
handleActionFoo(param1,param2);
} else if (action.equals(ACTION_BAZ)) {
final String param1 = intent.getStringExtra(EXTRA_PARAM1);
final String param2 = intent.getStringExtra(EXTRA_PARAM3);
handleActionBaz(param1,param2);
}
}
}
/**
* Handle action Foo in the provided background thread with the provided
* parameters.
*/
private void handleActionFoo(String param1, String param2) {
Log.d(TAG, "handleActionFoo." + param1 + " : " + param2);
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* Handle action Baz in the provided background thread with the provided
* parameters.
*/
private void handleActionBaz(String param1, String param2) {
Log.d(TAG, "handleActionBaz." + param1 + " : " + param2);
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind: ");
return super.onBind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: ");
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy: ");
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d(TAG, "onStart: ");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: ");
return super.onStartCommand(intent, flags, startId);
}
}
- Manifest清单文件注册IntentService
- 运行结果
02-19 10:02:52.565 26953-26953/cn.nuosi.andoroid.testintentservice D/MyIntentService: onCreate:
02-19 10:02:52.565 26953-26953/cn.nuosi.andoroid.testintentservice D/MyIntentService: onStartCommand:
02-19 10:02:52.566 26953-26953/cn.nuosi.andoroid.testintentservice D/MyIntentService: onStart:
02-19 10:02:52.566 26953-29115/cn.nuosi.andoroid.testintentservice D/MyIntentService: handleActionFoo.Jack : How are you?
02-19 10:02:57.569 26953-26953/cn.nuosi.andoroid.testintentservice D/MyIntentService: onDestroy:
02-19 10:03:11.269 26953-26953/cn.nuosi.andoroid.testintentservice D/MyIntentService: onCreate:
02-19 10:03:11.269 26953-26953/cn.nuosi.andoroid.testintentservice D/MyIntentService: onStartCommand:
02-19 10:03:11.269 26953-26953/cn.nuosi.andoroid.testintentservice D/MyIntentService: onStart:
02-19 10:03:11.269 26953-29379/cn.nuosi.andoroid.testintentservice D/MyIntentService: handleActionBaz.Tom : Fine!
02-19 10:03:11.270 26953-26953/cn.nuosi.andoroid.testintentservice D/MyIntentService: onDestroy:
通过结果输出大家可以看到当请求处理结束后,它就会自动关闭自己,而且我将工作线程休眠5秒主线程也没有ANR,非常方便啊。:)