android service

Service:Android的四大组件之一,起作用是用来在后台执行一些耗时的操作或者需要长期运行在后台的任务

与线程的区别:Service运行在主线程,和多线程没什么关系,Service在后台执行任务可控制,线程在后台执行任务不可控制

Service应用场景:

a.推送Serivce(监听服务器推送消息后发送广播app显示通知)

b.长连接Service(监听连接状态,状态发生改变后做相应的处理)

c.音乐播放器需要用到Service

d.实时天气APP中更新天气Service

...(大家知道有什么场景的可补充)

生命周期:onCreate, onStartCommand(2.0以下是onStart),onBind,onUnBind,onDestroy,额外还有一个onReBind

启动

方式一:startService(Intent)  这种方式启动的service,会执行生命周期中的onCreate-》onStartCommand,如果再次调用此方法不会再调用onCreate只会调用onStartCommand。关闭: 这种方式启动的sevice可以通过stopService(intent)的方式停止。

方式二:bindService(Intent)这种方式启动的service,会执行生命周期的onCreate->onBind,如果再次调用此方法,不会执行生命周期中的方法。关闭:这种方式启动的service当启动的组件销毁后该service也会销毁,或者在启动的组件(Activity)中调用unbindService(Intent)方法也可以停止该service.

什么情况下会执行onReBind呢?

当我们使用startService启动了一个Service,然后又在当前组件中(activity)使用bindService(intent)绑定了组件,

并且在自定义service中修改onUnbind方法,返回值修改为true,这样当我们unbind之后重新bindService()就会调用onReBind方法

使用bindService步骤:

1.在MyService(自己定义的Service)中定义内部类MyBinder继承Binder

public class MyBinder extends Binder{
public void println(){
Log.i(TAG,"hello I am binder");
};
public void sayHello(){
Log.i(TAG,"say hello:" + TAG);
}
}

2.定义成员变量MyBinder mBinder并初始化 ,并在onBind()方法中返回该成员变量对象;

private MyBinder mBinder = new MyBinder();

@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG,"onBind");
return mBinder;
}

3.在Activity中启动该setvice

创建绑定装填回调对象,在回调中接收IBinder对象来控制service:
private MyService.MyBinder mBinder;
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {

Log.i(TAG,"onServiceConnected");
mBinder = (MyService.MyBinder)service;
mBinder.println();

}

@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG,"onServiceDisconnected");
mBinder = null;
}
};


Intent intent = new Intent(ServiceActivity.this, MyService.class);
bindService(intent,serviceConnection,BIND_AUTO_CREATE);

其中上面方法中的第二个参数是绑定成功的回调,在这个回调中我们可以拿到IBinder对象,通过该对象可以调用MyBinder中的方法,第三个参数为常量代表创建service后自动绑定到Activity上。

 注意:1.unBindService时并不会回调onServiceDisconnected()方法,api文档中说明:只有在异常断开情况下才会调用该回调方法

   2:在activity中,只要之前成功绑定service,即时停止setvice,mBinder中的方法还可以调用。



原文地址:https://www.cnblogs.com/x-bing/p/5999352.html