Service入门

Service入门

1.什么是Service

1.1手机中的Service案例

Service入门_第1张图片

1.2为什么会有service?

由于手机的原因一个时刻只允许一个激活状态的Activity,其余的处于未激活

后台服务机制应运而生

1.3Service简介

  • 四大组件之一
  • 没有UI界面,后台服务,长时间运行
  • 与Activity是并列关系,都是Context子类
  • 可以交互
  • 不需要用户干预

1.4功能

  • 实现进程之间的通信工作

2.Service和Activity比较

2.1比较

Service

Activity

可执行程序

同上

有生命周期

同上

Context派生

同上

后台运行

反之

无UI界面

反之

不可以主动运行

反之

2.2选择标准

  • 呈现界面需要交互最好是Activity
  • 不需要界面考虑Service

2.3Service的应用常见

  • 下载任务
  • 音乐播放器
  • 网络连接服务
  • 定时触发任务

3.创建、注册、启动、停止

3.1创建

1.继承Service类

Service入门_第2张图片

2.Service的生命周期方法以及介绍

public class MyService1 extends Service {

    /*
    *
    * 创建的时候被调用一次,调用完成之后会销毁
    * */
    @Override
    public void onCreate() {
        super.onCreate();
    }

    /*
    * 采用startService启动服务的时候调用
    * Intent是从客户端传来的数据
    * flags是附加数据,表示启动的方式
    *startId表示当前服务的唯一的ID的值
    * */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Nullable
    @Override
    /*
    * 采用bind的方式启动的时候会被调用
    * 返回值是一个IBinder的接口实现类对象(需要自己去定义)
    * */
    public IBinder onBind(Intent intent) {
        return null;
    }

    /*
    *
    * 客户端调用unBindService的时候调用,断开改Service上连接的所有客户端
    * */
    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    /*
    * 当Service被关闭/销毁的时候调用
    * */

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

3.补充

Service入门_第3张图片

Service入门_第4张图片

3.2注册

1.服务创建完成后,要在AndroidManifest.xml文件中注册该Service,否则服务是不生效的。

Service入门_第5张图片

3.3启动

1.启动方式:2种

  • startService,不可以回传数据,无交互
  • bindService,可以回传数据,传参、方法调用可以交互

不管怎样Service都是不能自己启动的需要帮忙启动。

2.启动方式比较

  • 实际的开发都是bind

Start方式

Bind方式

用startService()来启动

用bindService()绑定启动

客户端与Service之间没有关联,即使客户端退出了,Service仍然运行,直到自身调用stopSelf()方法或者其他组件调用stopService()方法时服务停止,最终被系统销毁。

客户端与Service绑定在一起,所有的客户端退出,Service也就停止,但是只要有一个客户端存在,那么Service继续运行。其它组件通过Context.unbindService()停止服务。

客户端和Service之间无法通信法进行数据交互

客户端和Service之间可以通信,可以进行数据交互

3.4start启动方式

1.显式

  • 和Activity是类似的
  intent=new Intent(this,MyService1.class);
        startService(intent);

2.隐式启动

  • 必须设置setPackage不然的话会失败
 intent=new Intent();
        //需要设置app的包名否则无效
        intent.setPackage("com.lxz.app9");
        intent.setAction("com.lxz.app9Service");
        startService(intent);

Service入门_第6张图片

intent.setPackage("com.android.vending")

注意是程序的包名就是Activity所在的包。

3.5bind方式启动

1.启动过程

  • 不同在启动的过程
  • 多一个创建conn连接对象的过程
  • conn可以也是进行数据回传的接口

Service入门_第7张图片

2.Service的bind启动

如果我们解除与服务的绑定,只需调用unbindService(),此时onUnbind和onDestory方法将会被调用!这是一个客户端的情况,假如是多个客户端绑定同一个Service的话, 当一个客户端完成和service之间的互动后,它调用 unbindService() 方法来解除绑定。当所有的客户端都和service解除绑定后,系统会销毁service。

当首次使用bindService绑定一个Service时,系统会实例化一个Service实例,并调用其onCreate()和onBind()方法,然后调用者就可以通过IBinder和Service进行交互了,此后如果再次使用bindService绑定Service,系统不会创建新的Sevice实例,也不会再调用onBind()方法,只会直接把IBinder对象传递给其他后来增加的客户端!

3.bindService方法

Context中的绑定方法:

bindService (Intent service,ServiceConnection conn,int flags)

参数说明:

  • service:该Intent对象用于指定要启动的service
  • conn:该参数是一个serviceConnection对象,用于监听客户端与service之间的连接情况,当调用者与Service连接成功时将回调serviceConnection接口实现类对象conn的onServiceConnected(ComponentName name,IBinder service)方法,如果意外断开将回调onServiceDisConnected(ComponentName name)方法
  • flags:指定绑定时是否自动创建service,可指定为0(不自动创建)或BIND_AUTO_CREATE(自动创建)。

3.6混合启动方式

1.启动方式和绑定方式的结合

这两种使用方法并不是完全独立的,在某些情况下可以混合使用

以MP3播放器为例,在后台工作的Service通过Context.startService()启动某个特定音乐播放

但在播放过程中如果用户需要暂停音乐播放,则需要通过Context.bindService()获取服务链接和Service对象

进而通过调用Service的对象中的函数,暂停音乐播放过程,并保存相关信息

在这种情况下,如果调用Context.stopService()并不能够停止Service,需要在所有的服务链接关闭后,Service才能够真正的停止

4.生命周期

4.1start启动方式的生命周期

Service入门_第8张图片

Service入门_第9张图片

4.2bind方式启动

Service入门_第10张图片

你可能感兴趣的:(安卓软件开发,java,android,开发语言)