Android开发之Service

Service

Service的创建,启动,销毁

一个最基本的Service是这样的:

public class MyService extends Service {
    public MyService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

通过重写Service的onCreate()方法来创建一个Service;重写onStartCommand来启动一个Service;重写onDestory()方法来销毁一个Service。

在Activity中利用Intent为作为参数,调用startService(intent)启动一个服务,这个服务会自动调用它的onCreate()—->onStartCommand()方法;如果调用stopService(intent)则会执行onDestory()方法,销毁该Service,其中,onCreate()方法和onDestory()方法在Service的一生中只执行一次,而onStartCommand()方法则在每次启动Service时都会调用

Service和Activity之间的通信

Activity只是向Service发送了创建,开启,销毁的通知,一切的事情都是Service独立完成。为了实现两者之间的通信,需要利用Service中的onBind()方法。

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

onBind()方法的返回值是一个IBinder的实现类,Service返回给Activity一个IBinder,Activity通过在ServiceConnection中定义内部类,并重写onServiceConnected()方法和onServiceDisconnected()方法,来做出一些逻辑处理。
当Activity和Service绑定时,自动调用onServiceConnected方法,其参数中的IBinder对象就是由Service通过onBind()方法返回来的。
我们利用这个IBinder的实现来调用Service中的方法,其原理是:
在Service中,我们创建一个内部类继承Binder,其中Binder就是IBinder的实现类,在这个内部类中实现自己需要的逻辑方法,由于这个内部类可以访问外部类即Service的资源,所以在Activity中就可以实现与Service的通信啦。

Service的生命周期

  • 调用startService()方法开启一个服务

    • 如果Service是第一次启动,那么会首先执行onCreate()方法创建一个Service,然后继续执行onStartCommand()方法,直到调用了stopService()方法,这个Service才会被销毁。在这期间,onCreate()方法只会执行一次,以后的每次startService()调用,都会从onStartCommand()开始。
  • 调用bindService()方法开启一个服务

    • 同样,如果Service是第一次启动,首先执行onCreate()方法,但是onStartCommand()方法不会被执行,而是执行onBind()方法来返回一个IBand子类对象,之后,只要在不执行onUnBind()方法的情况下,服务都是畅通的,可以利用这个对象进行通信。
  • 同时调用startService()和bindService()

    • Android机制规定,必须同时满足onStop()和onUnBind()才能销毁这个服务

IntentService的使用

由于Service运行在主线程中,当执行一些比较耗时的逻辑时,应用很容易进入ANR(Application not respnding)状态。所以需要在Service的方法中增加单独的线程出来执行这些任务。例如:

//引自《第一行代码》
public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 处理具体的逻辑
                // 避免线程没有终点
                stopSelf();
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }
}`

以上这种方式实现了单独线程执行。但是Android中有更方便,封装良好的IntentService供我们使用。
让我们的Service成IntentService,由于父类没有默认的无参构造,所以子类要自己定义无参构造,并在里面调用父类的String类型构造方法。
重写父类方法onHandleIntent。我们的逻辑就卸载onHandleIntent()方法中,当逻辑执行完毕,自动会调用onDestory()销毁Service。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值