天天看点

你所不知道的IntentService

  今天无意中接触到IntenService。不知其意,于是,百度之。

  IntentService 和Service是经常作为比较的对象,不只是是因为有公共的名字“Service”,而且还因为IntentService是继承自Service的。那么,两者究竟有什么样的区别和联系呢。

  Service的话,作为android开发者都比较熟悉,它主要用在后台运行。例如:使用UC浏览器上网的时候,天天动听播放着音乐。那么IntentService继承自Service的话,这一作用  也是具备的。

  Service 的话在主线程中,所以它不能处理耗时太多的操作,如果需要处理耗时太多的操作的话,那么则需要另外开发线程进行处理;比如说操作数据库、连接网络等。

 而IntentService的话,它本身对于数据的处理另外开辟了线程进行处理,所以我的理解是它对Service做了一个很好的封装。它的实现机制是首先,创建一个消息队列,如果有任务需要进行处理的话,那么首先将任务加载到消息队列中,而真正处理消息的则在WrokThread线程中。通过先来先服务的方式对消息进行处理。

以下是两者关系示意图:

你所不知道的IntentService

两者的实现方式大体差不多,细节上有所不同,先来看看IntentService

我们需要进行耗时操作处理的话。继承IntentService。然后重写onHandleIntent 方法。我们的耗时处理实现写于此方法即可。

public class MyIntentService extends IntentService {

	public MyIntentService() {
		super("android");
	}

	@Override
	protected void onHandleIntent(Intent intent) {
		System.out.println("begin");
		try {
			Thread.sleep(20000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("end");

	}

}
           

接着我们再来看Servie

public class MyService extends Service {

	public void onCreate() {
		super.onCreate();
		System.out.println("create");
	}

	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		System.out.println("begin");
		try {
			Thread.sleep(20000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("end");

	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
}
           

我们在onStart方法中进行处理。但是我们不能处理耗时比较长的操作。如果需要的话,我们必须另起线程进行处理。

再说一句,上述两者都是通过startService方式启动的。

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		startService(new Intent(this, MyService.class));
		startService(new Intent(this, MyIntentService.class));
		startService(new Intent(this, MyIntentService.class));
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		// getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
           

好了,现在我们就知道了IntentService的作用了,它用于后台处理耗时的操作,诸如联网,操作数据库等。

继续阅读