Android四大组件之Service服务详细讲解
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
上一节:Activity
简介:在Android组件中最基本也是最为常见的四大组件:
- Activity
- Service服务
- Content Provider内容提供者
- BroadcastReceiver广播接收器
一、Service是什么
Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。
Service 有的启动方式有两种:
- startService启动
- bindService启动
二、Service 的启动方式
2.1、startService 显示启动
Service启动
首先我们创建一个MyService 类,并且继承自Service
1 2 3 4 5 6 7 | public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null ; } } |
这里需要先实现onBind方法,onBind()
是Service必须实现的方法,返回的IBinder对象相当于Service组件的代理对象,Service允许其他程序组件通过IBinder对象来访问Service内部数据,这样即可实现其他程序组件与Service之间的通信。
在AndroidManifest.xml
清单文件中注册
显式启动通过类名称来启动,需要在Intent中指明Service所在的类,并调用startService (lntent)启动service。这里我使用按钮测试,需要在activity 中添加一个 serviceStart 按钮,用来演示
回到MyService 类,并且添加一个onCreate 生命周期,用于验证我们的启动
1 2 3 4 5 | @Override public void onCreate() { super .onCreate(); System.out.println( "MyService.onCreate service 启动成功" ); } |
运行结果
通过该方式启动Service,访问者与Service之间没有关联,即使访问者退出了,Service也仍然运行。
按上面的说法,即使访问者退出了,Service也仍然运行,那么我们该怎么结束呢?
Service 停止
我们在Activity 中,再添加一个停止按钮。
显式启动停止Service,需要将启动Service的Intent传递给stopService (Intent)函数。
回到MyService 类,并且添加一个onDestroy 生命周期,用于验证我们的停止
1 2 3 4 5 | @Override public void onDestroy() { super .onDestroy(); System.out.println( "MyService.onDestroy service 停止" ); } |
运行结果
上面我说startService 是显示启动,那么是不是还有对应的隐式启动呢?确实是有,但是从Android5.0开始,Google要求必须使用显示Intent启动Service,所以隐式启动咱就不介绍了。
2.2、bindService 绑定启动
使用bindService()方法启动Service
我们在回到Activity 中,再添加两个按钮,onClickBindServiceStart 和 onClickUnBindService 按钮
1 2 3 | public void onClickBindServiceStart(View view) { bindService( new Intent( this , MyService. class ), connection, Context.BIND_AUTO_CREATE); } |
参数说明:
- service:该参数通过Intent指定需要启动的service。
- connection:该参数是ServiceConnnection对象,当绑定成功后,系统将调用serviceConnnection的
onServiceConnected ()
方法,当绑定意外断开后,系统将调用ServiceConnnection中的onServiceDisconnected方法。 - flags:该参数指定绑定时是否自动创建Service。如果指定为BIND_AUTO_CREATE,则自动创建,指定为0,则不自动创建。
初始化一个connection
1 2 3 4 5 6 7 8 | private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { } @Override public void onServiceDisconnected(ComponentName componentName) { } }; |
绑定启动中,当调用者通过bindService()
函数绑定Service时,onCreate()
函数和onBinde ( )
函数将被先后调用。
运行结果
通过该方式启动Service,访问者与Service绑定在一起,访问者一旦退出了,Service也就终止了。
unbindService 停止服务
取消绑定仅需要使用unbindService()
方法,并将ServiceConnnection传递给unbindService()
方法
在停止服务点击事件中使用 unbindService()
方法
回到MyService 类,添加onUnbind 生命周期方法
1 2 3 4 5 | @Override public boolean onUnbind(Intent intent) { System.out.println( "MyService.onUnbind" ); return super .onUnbind(intent); } |
当调用者通过unbindService()
函数取消绑定Service时,onUnbind()
函数将被调用。如果onUnbind()
函数返回true,则表示重新绑定服务时,onRebind ()
函数将被调用。
运行结果
需要注意的是,unbindService()
方法成功后,系统并不会调用onServiceConnected()
,因为onServiceConnected()
只会在意外断开绑定时才被调用。
这里别忘了在onDestroy()
销毁bindService
三、Service 生命周期
startService启动的生命周期
onCreate() 当Service第一次被创建时,由系统调用。
onStartCommand() 当startService方法启动Service时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。
注意:一个startService只会创建一次,销毁一次,但可以开始多次,因此,onCreate()和onDestroy()方法只会被调用一次,而onStart()方法会被调用多次。
bindService启动的生命周期
onCreate() 当Service被创建时,由系统调用。
onBind() 当bindService方法启动Service时,该方法被调用。
onUnbind() 当unbindService方法解除绑定时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。
注意:一个bindService可以创建多次,销毁多次,重复使用。
到此这篇关于Android四大组件之Service服务详细讲解的文章就介绍到这了,更多相关Android Service服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
Android实用小技巧之利用Lifecycle写出更好维护的代码
lifecycle是一个类,用于存储有关组件(如Activity或Fragment)的生命周期状态的信息,并允许其他对象观察此状态,下面这篇文章主要给大家介绍了关于Android实用小技巧之利用Lifecycle写出更好维护的代码的相关资料,需要的朋友可以参考下2022-05-05ActivityManagerService广播并行发送与串行发送示例解析
这篇文章主要为大家介绍了ActivityManagerService广播并行发送与串行发送示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-03-03android studio 打包自动生成版本号与日期,apk输入路径详解
这篇文章主要介绍了android studio 打包自动生成版本号与日期,apk输入路径详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-03-03
最新评论