android四大组件的作用简书,解读Android四大组件之Service

本文详细介绍了Android Service的生命周期,包括startService()和bindService()的区别,以及如何在Activity和服务间进行通信。Service的生命周期由onCreate()、onStartCommand()、onBind()、onUnbind()和onDestroy()等方法构成。Service通常用于执行后台任务,如资源下载和音视频播放。尽管Service运行在主线程,可能导致ANR,但通过异步处理可以在Service中执行耗时操作。同时,文章强调了Service相对于Activity的持久性,适合处理与UI不直接相关的长时间任务,并提供了基础的Service通信示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

分享这一篇文章的原因主要是因为在面试中,服务这个关键词的出现频率非常高。很多时候,面试官会问你,Service中能否进行耗时操作?我们稍后就会揭晓这个答案。

作用:服务于需要长期运行的任务,比如资源下载、音视频播放等。

生命周期

b55174d7bfde

生命周期图示

由图中可以直观的看出几点。

启动方式

存在方式

startService()

独立于Activity运行,自行结束或被叫停

bindService()

绑定于Activity运行,Activity结束时,会被叫停

涉及方法

用途

onCreate()

onDestroy()

onStartCommand()

用于计数,服务被调用的次数

onBind()

与Activity组件绑定

onUnbind()

与Activity组件解绑

使用方法

Service方法需要在AndroidManifest.xml中进行注册

// 第一步:启动

① startService(Intent);

② bindService(Intent, ServiceConnection, Int);

// 第二步:解绑(使用方法二启动时需要)

unBindService(ServiceConnection);

// 第三步:暂停

stopService(Intent);

Activity和Service的通信

Activity和Service的通信其实就是基于IBinder来进行实现的。但是IBinder其实是一个接口,对我们而言一般使用他的实现类Binder并通过强制转换来完成操作。

/**

* Service方法继承

* onBind()是一个抽象方法。

*/

public class LocalService ``extends Service {

private final IBinder binder = ``new Binder();

@Nullable

@Override

public IBinder onBind(Intent intent) {

return binder;

}

protected class ServiceBinder ``extends Binder {

LocalService getLocalService(){

return LocalService.``this``;

}

}

}

以上代码,是一个用于通信的基础版本。

既然需要通信,那我们总需要知道对方是谁,如果使用的是startService(),上文已经提到他是独立于Activity的,所以势必使用的是bindService()。

在上文的使用方法中已经提到了bindService()使用到的参数,Intent、ServiceConnection、Int。

ServiceConnection

在注释中已经比较清晰的写出了,代码的逻辑。

/**

* bindService()方法中的参数之一。

* 用于对service进行操作

*/

ServiceConnection connection = ``new ServiceConnection() {

// Activity和Service绑定时调用

@Override

public void onServiceConnected(ComponentName name, IBinder binder) {

service = ((LocalService.ServiceBinder)binder).getLocalService();

// ***需要干的事情

}

// Activity和Service解绑时调用

@Override

public void onServiceDisconnected(ComponentName name) {

service = ``null``;

}

};

Int

BIND_AUTO_CREATE:收到绑定需求,如果Service尚未创建,则立即创建。

BIND_DEBUG_UNBIND:用于测试使用,对unbind调用不匹配的调试帮助。

BIND_NOT_FOREGROUND:不允许此绑定将目标服务的进程提升到前台调度优先级

还有很多在Service类中

这是一个已经存在于Service类中的值,这里并不全部例举,一般来说都是使用BIND_AUTO_CREATE。

总结

在ANR机制中,Service的响应时长不能超过20s,其实也可以比较直观的看出,Service其实并不能进行所谓耗时操作。但是如果加上了Thread进行异步处理,那么其实他还是可以进行耗时操作的。(具体看你怎么进行回答,主要还是一个知识点,Service运行在主线程)

Service存在的原因是Activity是一个经常会被销毁的组件,虽然我们同样可以通过Thread进行异步操作,但是当Activity实例被销毁时,相应的捆绑在Activity生命周期内的Thread实例我们也没有能力再去寻找了。

最后

Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。

常言:种一棵树最好的时间有两个,一个是十年前,另一个就是现在。

我把自己这段时间整理的Android最重要最热门的学习方向资料放在了我的GitHub:https://github.com/xieyuliang/Android-P7,点击此处蓝色字体可以查看,里面还有不同方向的自学编程路线、面试题集合/面经、及系列技术文章等。

欢迎大家一起学习和探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值