安卓基础学习之服务组件及应用

安卓基础学习之服务组件及应用本文详细介绍了 Android 中的服务组件 包括服务的概念 本地服务与远程服务的区别 启动方式及其生命周期

大家好,欢迎来到IT知识分享网。

服务组件及应用

1. 服务概念

Service也是Android系统四大组件1之一,它是一种长生命周期、没有可视化界面、运行于后台的一种服务程序。
比如:播放音乐的时候,你有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,就听不到歌了——这就是Service的用武之地了。
Android后台运行的很多Service是在系统启动时被开启的,以支持系统的正常工作。
比如:MountService监听是否有SD卡安装及移除,PackageManagerService提供软件包的安装、移除及查看等。
激活和停止Service通常是由其他组件完成的。例如,组件Activity的超类Context提供了激活和停止Service的方法。
Context如同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启动方式与生命周期

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

(0)
上一篇 2025-03-21 21:05
下一篇 2025-03-21 21:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信