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

服务组件及应用

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",
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值