大家好,欢迎来到IT知识分享网。
目录
服务组件及应用
1. 服务概念
Service也是Android系统四大组件1之一,它是一种长生命周期、没有可视化界面、运行于后台的一种服务程序。
比如:播放音乐的时候,你有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,就听不到歌了——这就是Service的用武之地了。
Android后台运行的很多Service是在系统启动时被开启的,以支持系统的正常工作。
比如:MountService监听是否有SD卡安装及移除,PackageManagerService提供软件包的安装、移除及查看等。
激活和停止Service通常是由其他组件完成的。例如,组件Activity的超类Context提供了激活和停止Service的方法。
如同Activity组件一样,Service组件必须在清单文件里使用相应的标签。使用菜单File→New→Service创建的服务组件,将自动在清单文件里注册。
2. 服务类型
服务类型可划分为本地服务和远程服务,也可划分为绑定式服务与非绑定服务。
2.1 本地服务
本地服务用于应用程序内部(同一个apk内被调用),使用startService()启动服务,使用stopService()停止服务。
在服务内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。
2.2 远程服务
远程服务用于应用程序之间(被另一个apk调用)。
可以定义接口并把接口暴露出来,以便其他应用进行操作,比如一个天气预报服务。客户端建立到服务对象的连接,并通过那个连接来调用服务。
通过调用bindService()方法建立连接并启动服务,调用 unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
远程服务提供给可被其他应用复用。
3. service启动方式与生命周期
- 非绑定式服务:
使用startService()
启动service,调用onCreate()
和onStartCommand()
2两个方法。该service只能创建一次,也就是说onCreate()
只会执行一次。(但每次调用startService()
时,onStartCommand()
方法都会被调用。)
使用stopService()
来结束服务,调用onDestroy()
方法即可终止服务。 - 绑定式服务:
第一次执行bindService()
时,会调用onCreate()
和onBind()
方法创建服务并将service与activity绑定。(但是多次执行bindService()
时,并不会多次创建服务和绑定服务,也就不会再次调用这两个方法。)
当调用unbindService()
方法或者调用者Context不存在时,比如绑定的activity调用finish()
方法,就会调用onUnbind()
和onDestroy()
来结束服务。
-
非绑定式服务和绑定式服务的区别
- 1、startService启动的服务默认无限期执行,bindService启动的服务的生命周期与其绑定者相关。
- 2、若使用startService启动服务,则创建后将无法再与其传递消息;若使用bindService启动服务,则可以通过IBinder接口实现灵活的交互。
4. 两种方法的简单实例
4.1 非绑定式的服务
4.1.1 效果
界面如下图所示:
logcat中输出:
2020-04-17 16:10:52.756 24674-24674/com.example.myapplication_service V/MyService_unbind: service is created! 2020-04-17 16:10:52.756 24674-24674/com.example.myapplication_service V/MyService_unbind: service is started! 2020-04-17 16:11:01.823 24674-24674/com.example.myapplication_service V/MyService_unbind: service is destroyed!
4.1.2 代码
首先在项目中new一个Service(注意,Service中又两个选项,new的是Service而不是Service(IntentService))
创建初始会自带onBind()
方法,由于此处写的是非绑定式的方法,直接在里面return null;
即可。
MyService_unbind.java
import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; public class MyService_unbind extends Service {
public MyService_unbind() {
} @Override public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service. return null; } //创建服务 @Override public void onCreate() {
super.onCreate(); Log.v("MyService_unbind","service is created!"); } //开始服务 @Override public int onStartCommand(Intent intent, int flags, int startId) {
Log.v("MyService_unbind","service is started!"); return START_STICKY; }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/149867.html