Service的两种启动方式

本文深入探讨了Android中Service组件的两种启动方式:startService和bindService,并通过实验验证了这两种方式结合使用时Service的生命周期行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android开发的过程中,Service是一个非常重要的组件。
它的生命周期里面有几个特别重要的方法。

  1. Service的生命周期

onCreate 当服务创建的时候调用
onStartCommand startServcie的时候会调用这个方法
onBind 当有其他组件想通过bindService()方法绑定这个服务时系统就会调用此方法。在实现的方法里面,必须添加一个供客户端使用的接口通过返回IBinder来与服务通信,这个方法必须实现。当然想禁止绑定的话,返回null即可。
onDestory()
服务不再使用则调用该方法。服务应该事先这个方法来清理诸如线程,注册的监听器等资源。这是最后调用的方法。

  1. 服务启动的两种方式

启动Service有两种方式:1.startService 2.bindService
这两种启动方式,一种是需要跟生命周期绑定,
如果同时以两种方式来启动service,会走service生命周期的哪些方法?
1.startservice启动后,service会一直在后台运行,直到主动调用stopservice函数。
2.bindservice启动后,service在绑定的activity摧毁以后会自动停止。
这里写图片描述

  1. 如果以两种方式启动同一个服务会怎样?

我们用实际例子验证下,首先新建一个Activity,上面放置四个按钮,分别对应startservice,bindservice,unbindservice,stopservice四个函数。具体代码如下:

 @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                     Intent intent  = new Intent(v.getContext(),MyService.class);
                     startService(intent);
                break;
            case R.id.button2:
                    Intent intent2 = new Intent(v.getContext(), MyService.class);
                    bindService(intent2, conn, Context.BIND_AUTO_CREATE);
                break;
            case R.id.button3:
                unbindService(conn);
                break;
            case R.id.button4:
                Intent intent3  = new Intent(v.getContext(),MyService.class  );
                stopService(intent3);
              break;


        }
    }

首先,我们点击startservice
这里写图片描述
再点击onbind的时候,执行onbind方法。
这时候我们就算再次绑定服务,还是只会执行一次onbind方法。
好了,现在这个服务不想要了。
我们点击 unbindservice取消绑定服务。这时候只执行了onUnbind函数。但是没有执行onDestory。说明服务还没有销毁掉。
这时候我们点击StopService。日志上显示onDestroy。说明这时候服务才被销毁。
总结:当开启一个服务后,然后绑定一个服务后,就算取消绑定了,那个服务也还会在,直到我们调用了stopservice。
再来。
先点击绑定服务。这时候日志上显示

 31898/service.example.com.servicedemo D/TAG: OnCreate
 31898/service.example.com.servicedemo D/TAG: onBin
d

这次我们先执行的是bindService,然后执行startService
这里写图片描述
这时候日志里面执行了onstartcommand onstat
t
然后如果想关掉这个服务我执行stopservice,然后没看见打印任何东西,这时候我执行unbindservice,然后输出onunbind ondestryy
y
通过以上的实验证明,一个服务如果如果通过两种不同的启动方法,那么在它还有绑定的activity的时候,就算执行了stopservice,它也不会被关闭。 相对的,一个通过startservice启动的服务,然后绑定了服务的同时i,就算执行了unbindservice,它也还未被关闭,只有执行了stopservice后才能销毁。这就是用两种方式启动service后,service的生命周期。
附上我的代码地址:
https://github.com/preqel/ServiceDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值