Android Service相关

2017-07-04  本文已影响0人  FelixLiuu

Android 的 Service 是四大组件之一,有着非常重要的地位。下面来记录一些重要的知识点。

常用方法

方法 说明
startService() 启动服务(两种启动方式之一)
bindService() 绑定服务(两种启动方式之一)
stopService() 关闭服务(对应startService)
unbindService() 解绑服务(对应bindService)
onCreate() 创建服务(生命周期)
onStartCommand() 开始服务(生命周期)
onDestroy() 销毁服务(生命周期)
onBind() 绑定服务(生命周期)
onUnbind() 解绑服务(生命周期)

生命周期

startService

startService -> onCreate -> onStartCommand -> stopService -> onDestory

注意 :多次调用startService,onCreate 只会执行一次,onStartCommand 会多次调用

bindService

bindService -> onCreate -> onBind -> unbindService -> onUnBind -> onDestory

同时使用 startService 和 bindService

startService -> onCreate -> onStartCommand -> bindService -> onBind -> unbindService -> onUnBind -> stopService -> onDestory

特别注意

Service 的类型及应用场景

Service类型场景

Service 和 Thread 区别

Service和Thread之间没有任何关系

名称 相同点 不同点
Service 作用:执行异步处理 1、运行在主线程(不能处理耗时操作 否则ANR) 2、依赖进程而非Activity
Thread 作用:执行异步处理 1、运行于工作线程 2、依赖某个Activity

Service 可以和 Thread 配合使用处理耗时操作~

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

class MyBinder extends Binder {  
    public void service_connect_Activity() {  
      //新建工作线程
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                // 执行具体的下载任务  
            }  
        }).start();  
    }  
}

Service 和 IntentService 区别

IntentService是Android里面的一个封装类,继承自四大组件之一的Service。用来处理异步请求,实现多线程。(常用于 按顺序、在后台执行 的下载场景)

IntentService源码

public abstract class IntentService extends Service {
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;

private final class ServiceHandler extends Handler {
    public ServiceHandler(Looper looper) {
        super(looper);
    }

    @Override
    public void handleMessage(Message msg) {
        onHandleIntent((Intent)msg.obj);
        stopSelf(msg.arg1);
    }
}
public IntentService(String name) {
    super();
    mName = name;
}
@Override
public void onCreate() {
    // TODO: It would be nice to have an option to hold a partial wakelock
    // during processing, and to have a static startService(Context, Intent)
    // method that would launch the service & hand off a wakelock.

    super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
}

@Override
public void onStart(@Nullable Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
    onStart(intent, startId);
    return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}

@Override
public void onDestroy() {
    mServiceLooper.quit();
}

/**
 * Unless you provide binding for your service, you don't need to implement this
 * method, because the default implementation returns null.
 * @see android.app.Service#onBind
 */
@Override
@Nullable
public IBinder onBind(Intent intent) {
    return null;
}
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);

从源码可以看出

因此依据源码注释提示,复写方法onHandleIntent(),再在里面根据Intent的不同进行不同的线程操作就可以了。

注意事项

原因:多次startService时,onCreate只执行一次,只会创建一个工作线程!却会多次执行onStartCommand,由源码可见,只是把消息加入消息队列中等待执行~

源码中,onBind()是默认返回null的,而采用bindService() 启动 IntentService的生命周期是:onCreate() —>onBind()—>onunbind()—>onDestory()
并不会调用onstart()或者onstartcommand()方法,所以不会将消息发送到消息队列,那么onHandleIntent()将不会回调,即无法实现多线程的操作。

**如上介绍了IntentService,Service 和 IntentService 区别主要是

名称 不同点
Service 1、依赖于应用程序的主线程(不是独立的进程 or 线程)2、需要主动调用stopSelft()来结束服务
IntentService 1、创建一个工作线程来处理多线程任务 2、IntentService不需要(在所有intent被处理完后,系统会自动关闭服务)
上一篇下一篇

猜你喜欢

热点阅读