Android四大组件之Service

来源:互联网 发布:mac家装设计软件 编辑:程序博客网 时间:2024/05/21 04:39

     Service,服务,是Android的四大组件之一,可以在Android的后台运行,用户看不到界面。我先讲一下Service的生命周期

     当我们调用startService()方法的时候,相应的服务就会启动起来,如果这个服务之前未启动过,则onCreate()->onStartCommand(),如果这个服务之前启动过,则只会执行onStartCommand(),不会再执行onCreate(),虽然会调用多次onStartCommand()但是每个服务只会存在一个实例。如果我们想停下来这个服务,那么我们需要调用一次stopService()或stopSelf()方法。

      我们也可以调用Context的bindService()来获取一个服务的持久链接,这时就会回调服务中的onBind()方法,返回IBinder的实例,实现与调用方的通信。只要没有调用unbindService()方法,这个服务就会一直保持。

       记住,startService()对应stopService()才能使服务中onDestory()方法执行销毁服务。bindService()对应unbindService()方法,才能使服务中onDestory()方法执行销毁服务。如果你两种方式都调用过,那么必须同时调用stopService()和unbindService()方法,onDestory()方法才会执行。

      很多人会问我用bindService()去调用服务,返回IBinder,这个IBinder如何创建?我们需要在Service类中创建一个内部类如MyBinder。

      

class MyBinder extends Binder{  public void startload(){      .....   }}
然后在我们的调用方中这样写

private ServiceConnection connection = new ServiceConnection(){ @Override  public void onServiceDisconnected(ComponentName name){  }   @Override   public void onServiceConnected(ComponentName name,IBinder service) {      myBinder = (MyService.MyBinder)service;      myBinder.startload();//调用service中的方法,实现通信 }

使用IntentService

如果我们想在服务中做复杂耗时的操作,我们势必想到的是new Thread()开启一个子线程去处理复杂逻辑,然后操作完后调用stopself().这样当然没问题,但是总有写人会忘记开启线程或者调用stopSelf()。所以我们可以使用IntentService.

public class MyIntentService extends IntentService{    public MyIntentService(){       super("MyIntentService")//调用父类的有参构造函数   }   @Override   protected void onHandleIntent(Intent intent) {     //处理复杂的逻辑,这个方法已经运行在子线程中,不需要new thread   }   @Override   public void onDestory() {     super.onDestory();   }}

  IntentService的特性:这个服务会在运行结束后,自行调用onDestory()方法去停止该服务,是不是很方便啊。

1 0
原创粉丝点击