前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 四大组件学习之Service五

Android 四大组件学习之Service五

作者头像
DragonKingZhu
发布2022-05-08 16:06:08
1700
发布2022-05-08 16:06:08
举报

本节学习IntentService, 可能就有人问了, 什么是IntentService, IntentService有什么作用? 不是已经有了Service,那为什么还要引入IntentService呢?

带着这两个问题,我们先来看一个例子:

我们新建一个MyIntentService例子:

代码语言:javascript
复制
public class MyIntentService extends IntentService {

	private int count = 5;
	public MyIntentService() {
		super("MyIntentService");
		// TODO Auto-generated constructor stub
	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		Log.i("MyIntentService", "onBind------------");
		return super.onBind(intent);
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		Log.i("MyIntentService", "onCreate------------");
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		Log.i("MyIntentService", "onDestroy------------");
		super.onDestroy();
	}

	@Override
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		Log.i("MyIntentService", "onStart------------");
		super.onStart(intent, startId);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		Log.i("MyIntentService", "onStartCommand------------");
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	protected void onHandleIntent(Intent arg0) {
		// TODO Auto-generated method stub
		
		while(count > 0)
		{
			//设置时间的输出方式
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String  time = format.format(new Date());
			
			//显示时间
			Log.i("MyService", time);
			
			try {
				//延迟一秒
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			count--;
		}
	}

}

其中IntentService是Service的子类,需要继承与Service。

在MyActivity中增加一个button,用于启动MyIntentService

代码语言:javascript
复制
		btn_intent.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// 启动服务
				Intent intent = new Intent(MyActivity.this, MyIntentService.class);
				Log.i("MyActivity", "启动Intent服务按钮被按下!");
				startService(intent);
			}
		});

运行效果如下:

可以看到我们的界面没有出现卡住,(关于卡住不动,请看我Service二那节)。同时打印5次后,自动destory。

既然现象已经看了,我总结一下:

Service与IntentService之间的区别

在这之前,需要知道Service的不足之处

a: Service不是专门的一条新的线程,因此不应该在Service中处理相当耗时的任务

b:service也不会专门的启动一个新的线程,Service与它所在的应用位于同一个进程中的。

所以,对于Service的2个缺陷,就引入了IntentService。

a:IntentService会使用一个队列来关联Intent的请求,每当Activity请求启动IntentService时,IntentService会将该请求加入一个队列,然后开启一个新的线程去处理请求。所以IntentService不会把主线程卡死

b:IntentService会创建单独的线程处理onHandleIntent()方法里的实现代码

c:同时IntentService不用重写onBind, OnStartCommand方法,只需实现onHandleIntent()方法

d:当所以的请求处理完后,Intent后自动停止服务,无需手动停止服务

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档