Android Service简介

前言

Service通常被用来做一些后台操作,并且不依赖于界面。

1. Service调用

自定义DemoService需要继承Service,并且在配置文件中声明。

<service android:name=".component.service.DemoService" />

可以在Activity中启动和停止Service

private void startService() {
    startService(new Intent(this, DemoService.class));
}

private void stopService() {
    stopService(new Intent(this, DemoService.class));
}

Service生命周期,

首次启动Service,依次调用onCreate()onStartCommand(Intent, int, int)方法。
如果Service没有停止,再次启动Service,只会调用onStartCommand(Intent, int, int)方法。
停止Service,调用onDestroy()方法。

可以指定onStartCommand(Intent, int, int)的返回值

  • START_STICKY:服务被异常kill掉,系统自动重启该服务, 但intentnull
  • START_NOT_STICKY:服务被异常kill掉,系统不会自动重启该服务
  • START_REDELIVER_INTENT:服务被异常kill掉,系统自动重启该服务, 并且重传intent
  • START_STICKY_COMPATIBILITYSTART_STICKY的兼容版本,但不保证服务被kill后一定能重启。

ServiceActivity同样运行在主线程,费时操作需要添加线程。

2. Service绑定

Service中定义一个Binder,用来返回Service

public class DemoService extends Service {

    private IBinder binder = new DemoBind();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    public class DemoBind extends Binder {
        public DemoService getService() {
            return DemoService.this;
        }
    }

}

Activity中需要定义一个ServiceConnection,用来获取Binder

private ServiceConnection sc;
private DemoService service;

private void bindService() {
    if (sc == null) {
        sc = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder binder) {
                service = ((DemoService.DemoBind) binder).getService();
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                service = null;
            }
        };
        bindService(new Intent(this, DemoService.class), sc, BIND_AUTO_CREATE);
    }
}

private void unbindService() {
    if (sc != null) {
        unbindService(sc);
        sc = null;
    }
}

绑定Service的生命周期,

  • 绑定Service时,依次调用onCreate(Bundle)onBind()方法。
  • 解绑Service时,依次调用onUnbind(Intent)onDestroy()方法。

在绑定的同时启动Service

  • 解绑Service,只会调用onUnbind(Intent)方法。
  • 停止Service,也不会调用onDestroy()方法。

3. AIDL服务

AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言,主要用于跨进程通信。

定义一个AIDL文件,以aidl结尾,自动生成java文件。

interface IAidlInterface {
    int add(int val1, int val2);
}

定义AIDL服务,

public class AidlService extends Service {
    private AidlInterface mInterface = new AidlInterface();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mInterface;
    }

    private static class AidlInterface extends IAidlInterface.Stub {

        @Override
        public int add(int val1, int val2) {
            return val1 + val2;
        }

    }

}

获取AIDL服务,

private IAidlInterface aidlInterface;
private ServiceConnection sc

private void bindAidlService() {
    sc = new ServiceConnection(){

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            aidlInterface = IAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            aidlInterface = null;
        }
    };
    bindService(new Intent(this, AidlService.class), sc, BIND_AUTO_CREATE);
}

需要注册Service服务,

<service android:name=".component.service.AidlService" android:process=":remote" />

相关文章
Android Service简介
Android IntentService应用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值