IntentService简介

来源:互联网 发布:曙光大数据学院是几本 编辑:程序博客网 时间:2024/06/06 01:54

IntentService可以理解为集合了Service ,HandlerThread 以及Hanler的优势于一身的一个服务。 它与Service的不同主要在于,Service是依赖于主进程的,所以一些耗时的操作如果放在主进程里面进行操作的话很容易造成ANR。而IntentService由于引进了HandlerThread与Handler,即可开辟新的线程来实现耗时的操作,便不会产生ANR的问题。另外在IntentService中最核心的方法就是onHandleIntent(Intent intetn),他是将传入onStartCommand(Intent intent,int flag , int startId)中的Intent又传入到onHandleIntent中,这样做的目的是可以进行多任务的一个处理,即比如我同时启动多个startSerivice(intent), 按照顺序在IntentService中也可以顺序将任务执行完毕。

下面是IntentService使用的简单用法。

package com.vic.handler;public class TestIntentService extends IntentService{private static final String TAG = "MLJ";public TestIntentService() {super(TAG);Log.i(TAG,this+" is constructed");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d("MLJ","onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overrideprotected void onHandleIntent(Intent intent) {Log.d("MLJ","task is running, thread=" + Thread.currentThread());try {Thread.sleep(3000);if(intent.getAction().equals("com.vic.demo")){Log.d("MLJ","execute the com.vic.demo task");}} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic void onDestroy() {Log.d("MLJ","onDestory");super.onDestroy();}}
调用IntentService启动代码

import com.vic.demo.R;public class TestHandlerThread extends Activity{private Handler mHandler = null;private Button mButton = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.test_layout);mButton = (Button) findViewById(R.id.test);mButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {Intent i1 = new Intent(TestHandlerThread.this,TestIntentService.class);i1.setAction("com.vic.demo");startService(i1);Intent i2 = new Intent(TestHandlerThread.this,TestIntentService.class);i2.setAction("com.vic.demo2");startService(i2);Intent i3 = new Intent(TestHandlerThread.this,TestIntentService.class);i3.setAction("com.vic.demo3");startService(i3);}});}}
当然最后还需要在AndroidManifest中对IntentService进行声明

<service android:name="com.vic.handler.TestIntentService"></service>
打印出的日志如下


从结果我们可以看到,IntentService中执行onStartCommand后再执行onHandleIntent方法并将intent传递进去,这样就可以处理多个intent的请求了。另外从打印的线程信息也可以看到IntentService是运行在一个单独的线程里的。

IntentService有以下特点:
(1)  它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
(2)  创建了一个工作队列,来逐个发送intent给onHandleIntent()。
(3)  不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
(4)  默认实现的onBind()返回null
(5)  默认实现的onStartCommand()的目的是将intent插入到工作队列中


0 0
原创粉丝点击