你所不知道的IntentService

 

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

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

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

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

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

以下是两者关系示意图:

 

                                                                      


两者的实现方式大体差不多,细节上有所不同,先来看看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的作用了,它用于后台处理耗时的操作,诸如联网,操作数据库等。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值