Android线程: IntentService使用及源码分析

IntentService是一种特殊的Service,它继承了Service。

IntentService是一个抽象类,因此必须创建它的子类才能使用IntentService。IntentService可用于执行后台耗时的任务,当任务执行后它会自动停止,同时由于IntentService是服务的原因,这也导致它的优先级比单纯的线程要高很多,所以IntentService比较适合执行一些高优先级的后台任务,因为它优先级高,不容易被系统杀死。在实现上,IntentService封装了HandlerThread和Handler,这一点可以从它的onCreate方法中看出来,如下所示:

    @Override
    public void onCreate() {
     
        // TODO: It would be nice to have an option to hold a partial wakelock
        // during processing, and to have a static startService(Context, Intent)
        // method that would launch the service & hand off a wakelock.

        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

当IntentService被第一次启动时,它的onCreate方法会被调用,onCreate方法会被创建一个HandlerThread,然后使用它的Looper来构造一个Handler对象mServiceHandler ,这样通过mServiceHandler 发送的消息最终都会在HandlerThread中执行,从这个角度来看,IntentService也可以用于执行后台任务。

每次启动IntentService,它的onStartCommand方法就会调用一次,IntentService在onStartCommand中处理每个后台任务的Intent。

下面通过一个示例来说明IntentService的工作方法,首先派生一个IntentService的子类,代码如下:

public class LocalIntentService extends IntentService {
     
    
    private static final String TAG = "LocalIntentService";
    
    public LocalIntentService() {
     
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
     
        String tasks = intent.getStringExtra("task");
        Log.d(TAG, "receive task :" + tasks);
        SystemClock.sleep(3000);
        if ("task2".equals(tasks)) {
     
            Log.e(TAG, "handle task" + tasks);
        }
    }

    @Override
    public void onDestroy() {
     
        Log.e(TAG, "service destroyed");
        super.onDestroy();
    }
}

这里对LocalIntentService 的实现做一个简单的说明。在onHandleIntent方法中会从参数中解析出后台任务的标识,即task字段所代表的内容,然后根据不同的任务标识来执行具体的后台任务。这里为了简单起见,直接通过 SystemClock.sleep(3000)来休眠3000毫秒从而模拟一种耗时的后台任务,另外为了验证IntentService的停止时机,这里在onDestroy()中打印了一句日志。LocalIntentService 实现完成了以后,就可以在外界请求执行后台任务了。

下面的代码中先后发起了3个后台任务的请求:

public class MainActivity extends AppCompatActivity {
     

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent service = new Intent(this, LocalIntentService.class);
        service.putExtra("task", "task1");
        startService(service);
        service.putExtra("task", "task2");
        startService(service);
        service.putExtra("task", "task3");
        startService(service);
    }
}

LocalIntentService 是Service类,属于四大组件,需要在AndroidManifest中进行注册。

运行程序,观察日志,如下所示:
Android线程: IntentService使用及源码分析_第1张图片
从上面的日志可以看出,三个后台任务是排队执行的,它们的执行顺序就是它们发起请求时的顺序,即task1、task2、task3。另外一点就是当task3执行完毕后,LocalIntentService 才真正地停止。从日志中可以看出LocalIntentService 执行了onDestroy(),这也意味着服务正在停止。

你可能感兴趣的:(Android进程框架,IntentService,Service)