Service 总结

2016/6/4 posted in  Android

Service的种类

按照进程分类

本地服务

  1. 主进程上运行
  2. 主进程结束时,服务也结束

远程服务

  1. 独立进程
  2. 主进程结束时,服务不受影响
  3. 使用aidl作为通信方式

按运行类型分类

前台服务

在通知栏会常驻,随着服务的结束,通知栏也会消失

后台服务

用户看不到效果,通常作为同步的服务

启动方式分类

  1. startService 启动的服务
    主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService
  2. bindService 启动的服务
    通过binder通信,停止服务使用unbindService
  3. startService 同时也 bindService 启动的服
    停止服务应同时使用stepService与unbindService

Service 与 Thread 的区别

1.Thread独立于Activity,不随着Activity的结束而终止,service会随着Activity的结束而终止。
2.在某一Activity中创建Thread后,不能在别的Activity对其进行控制,而service可以通过 binder,aidl,boardcast等进行通信。

生命周期

  • onCraet
    不管startService几次,系统只会创建Service的时候调用一次。
  • onStart
    startService的时候调用
  • onDestroy
    当服务被停止时的时候被调用。

当在旋转手机屏幕的时候,因此旋转之前的使用 bindService 建立的连接便会断开

调用startService后调用stopService,这时服务中的onDestory会执行,同样,调用binderService后,调用unbinderService,服务中的onDestory会执行。同时调用startService和binderService,必须同时调用stopService和unbinderService,onDestory才会执行

intentService

在android中,service的代码默认都是运行在主线程中的,如果直接运行一些耗时的程序容易出现ANR。
通常需要在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() {
                //具体任务
                
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }
}

但是这样的服务一旦启动之后,就会一直处于运行状态,必须调用stopService或者stpSelf才能使任务停下来,

    @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);
    }

有时候会忘记stopSelf或者开子线程,android提供了一个IntentService类

public class MyService extends IntentService{
    public MyService(String name) {
        super("MyService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        //处理任务,自动开子线程
    }
}

首先提供一个无参的构造函数,并必须在其内部调用父类的有参的构造函数,。

参考 http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html
《第一行代码》