Android service基础

本文详细介绍了Android Service的基础知识,包括创建Service、Service的三种启动方式(startService、bindService以及startService+bindService)、在绑定操作中实现服务监听以及如何从应用外启动Service。内容涵盖Service生命周期、Intent使用以及与Activity的交互。

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

 service用于在后台处理耗时操作

目录

1、service创建:

2、service的三种启动方式:

3、在绑定操作中实现对服务的监听

4、应用外服务的启动

1、service创建:

  • 创建一个类继承android.app.Service类,实现其抽象方法
  • 在AndroidManifest文件中aplication标签配置Service
 <service
    android:name=".MyService"
    android:enabled="true"
    android:exported="true">
</service>

2、service的三种启动方式:

(1)startService:启动服务,独立于activity在后台保持运行,不受activity生命周期影响
生命周期:startSerevice()→onCreate()→ onStartCommand()→onDestroy()
                 创建→启动→销毁
activity中service启动:startService(intent)

 Intent intent=new Intent(MainActivity.this,MyService.class);
        startService(intent);

service停止: stopService(intent)

 Intent intent=new Intent(MainActivity.this,MyService.class);
       stopService(intent);


注意:onCreate()方法只会在Service第一次被创建的时候调用,如果服务销毁了,则重新调用onCreate(),如果服务没有被销毁重新开启创建的服务则不会执行onCreate()直接调用onStartCommand()执行生命周期

(2)BindService:绑定服务  服务创建,并未开启,不会引起服务在后台运行,随activity销毁而销毁,通常用来对service执行的任务进行进度监控
生命周期: bindService()→onCreate()→ onBind()→onUnbind()→onDestroy()
                  创建→绑定→解绑→销毁
activity中service启动:bindService() onBind()onServiceDisconnected()

 Intent intent=new Intent(MainActivity.this,MyService.class);
        ServiceConnection serviceConnection= new ServiceConnection() {///用于绑定客户端和服务
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {//当客户端和服务连接正常时,执行绑定操作会被调用

            }

            @Override
            public void onServiceDisconnected(ComponentName name) {//当绑定的客户端和服务正常连接丢失时会被调用

            }
        };
        //绑定
        bindService(intent,serviceConnection ,BIND_AUTO_CREATE);

service停止: unbindService(serviceConnection)

unbindService(serviceConnection);

注意:onBind()只会在第一次绑定服务的时候后调用,需要通过onUnbind()方法解除绑定才能再次实现服务绑定,且解除绑定后,重新绑定不会在调用onBind()方法,再次解除绑定也不会调用onUnbind()方法,再次绑定只会执行ServiceConnection里的方法,条件Service里的IBinder onBind(Intent intent)方法返回一个 IBinder()对象,为了避免复杂IBinder()所有接口实现,可以直接返回一个Binder()对象, Binder类实现了IBinder()所有接口

public IBinder onBind(Intent intent) {
      // Binder类实现了IBinder()所有接口
       // 因此可以返回一个Binder类
       /* return new IBinder() {
            @Override
            public String getInterfaceDescriptor() throws RemoteException {
                return null;
            }

            @Override
            public boolean pingBinder() {
                return false;
            }

            @Override
            public boolean isBinderAlive() {
                return false;
            }

            @Override
            public IInterface queryLocalInterface(String descriptor) {
                return null;
            }

            @Override
            public void dump(FileDescriptor fd, String[] args) throws RemoteException {

            }

            @Override
            public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException {

            }

            @Override
            public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
                return false;
            }

            @Override
            public void linkToDeath(DeathRecipient recipient, int flags) throws RemoteException {

            }

            @Override
            public boolean unlinkToDeath(DeathRecipient recipient, int flags) {
                return false;
            }*/


       return new Binder();
  }

(3)startService(intent)+BindService():

通过BindService()创建的服务并未运行,运行需要通过startService(intent)方法实现服务启动运行
如果startService(intent),然后BindService(),必须要先解除绑定服务,才能执行onDestroy()方法进行服务销毁
执行顺序:
  startService()→onCreate()→ onStartCommand()→onBind()→onUnbind()→onDestroy()
注意:创建服务→绑定,没有解绑重新开启创建的服务,只会执行 onStartCommand()方法,重新绑定和解绑都不会执行onBind()onUnbind()除非是执行了onDestroy()然后重新创建服务,只会执行ServiceConnection类里的方法

  • onServiceConnected():执行服务的绑定操作,当客户端正常连接服务时,会被调用
  • onServiceDisconnected(): 当客户端正常连接丢失时调用
private  ServiceConnection serviceConnection= new ServiceConnection() {//用于绑定客户端和服务
        @Override
        public void onServiceConnected(ComponentName name, IBinder iBinder) {//当客户端正常连接服务时,执行服务的绑定操作会被调用
                 
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {//当客户端正常连接丢失时调用
            
        }
    };

3、在绑定操作中实现对服务的监听

  • Service内部,自定义一个内部类继承Binder
//自定义一个内部类,继承Binder类
    class MyBinder extends Binder{
        //定义自己的方法
        int getProcess(){
                return i;
            }
        }
  • IBinder onBind(Intent intent)方法的返回值改为该自定义的类
 return new Binder()→ return new MyBinder();

4、应用外服务的启动

(1)为service添加一个意图过滤器和别名

 <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.kmust.action.My_Service"/>
            </intent-filter>
        </service>


(2)应用外的activity中对其它服务的操作

开启、绑定、解绑、关闭服务操作大同小异,只是intent传入的参数不同

Intent intent=new Intent("com.kmust.My_Service");
intent.setAction("com.kmust.My_Service");//service的action名字
intent.setPackage("com.moxuan.test");//service所在的包名

//开启服务
startService(intent)
//绑定服务
bindService(intent,serviceConnection ,BIND_AUTO_CREATE)
//解绑服务
unbindService(serviceConnection)
//停止服务
stopService(intent)

注意:setAction()传入的service的action名字setPackage()传入的service所在的包名一定要对应一致否则无法开启服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值