提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、Service 的启动方式
startservice
startservice的生命周期和activity的生命周期无关,启动一个后台任务,不进行通信,停止服务使用stopservice
startservice生命周期
onCreate
1.如果service没有被创建过,调用startservice 的时候会执行onCreate回调
2.如果service已经在执行,调用startservice则不会执行onCreate
onStartCommand
每次service创建或者运行的时候都会执行
onBind()
Service中的onBind()方法是抽象方法,Service类本身就是抽象类,所以onBind()方法是必须重写的,即使我们用不到。
onDestory()在销毁的时候会执行Service该方法。
bindservice
bindservice的生命周期和activity绑定在一起,会受activity的生命周期的影响,当activity销毁的时候,service也会被销毁,启动一个服务,可以与后台进行数据通信停止服务用unbindservice
bindservice的生命周期和绑定的界面生命周期在一起
service与activity的通信通过创建一个类继承Binder , onBing方法返回实现
startservice同时也bindservce,停止服务的时候stopservice也unbindservice
两种启动模式使用方式
//普通启动方法
startService(intent);
//service的数据交互的绑定方法
bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
二、使用步骤 创建service后台服务
public class TestService extends Service {
private String token;
//接口回调的数据
public List<Abnormal_Info.DataBeanX.DataBean> data;
//循环状态
boolean flag=true;
//通过创建一个类来继承bind实现后台与前台通信
public class DownloadBinder extends Binder {
public TestService gettestservice(){
return TestService.this;
}
public void startDownload() {
token = SPUtils.getStringFromSP("token");
//耗时操作在子线程中执行
Thread thread = new Thread(){
@Override
public void run() {
//执行耗时代码
while (flag){
try {
//
Map<String, Object> map = new HashMap<>();
map.put("offset", 1);
map.put("limit", 10);
NetUtil22.getInstance().getInfoHavaToken(Constant22.BASE_Abnormal, Abnormal_Info.class, map, token, new NetUtil22.NetCallBack() {
@Override
public void onSuccess(Object o) {
//请求到数据之后
if(o instanceof Abnormal_Info){
Log.e("Service","后台打印第一条数据:"+((Abnormal_Info) o).getData().getData().get(0).getName());
//接口回调将数据传回去
data = ((Abnormal_Info) o).getData().getData();
ser_callBack.onClick(data);
}
}
@Override
public void onError(String error) {
Log.e("Service","后台的失败信息:"+error);
}
});
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
super.run();
}
}
};
//开始执行线程
thread.start();
}
}
@Override
public void onCreate() {
Log.e("Service","onCreate");
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
Log.e("Service", "onBind");
return new DownloadBinder();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("Service","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("Service", "onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.e("Service","onDestroy");
flag=false;
super.onDestroy();
}
//接口回调
public interface Ser_CallBack{
void onClick(List<Abnormal_Info.DataBeanX.DataBean> data);
}
public Ser_CallBack ser_callBack;
public void setSer_callBack(Ser_CallBack ser_callBack){
this.ser_callBack=ser_callBack;
}
}
1. 主页面代码
//连接service类
intent = new Intent(this, TestService.class);
2.主页面代码 连接service服务,获取后台数据,完成前台后台数据交互
serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
TestService.DownloadBinder binder = (TestService.DownloadBinder) service;
binder.startDownload();
binder.gettestservice().setSer_callBack(new TestService.Ser_CallBack() {
@Override
public void onClick(List<Abnormal_Info.DataBeanX.DataBean> data) {
Log.e("Service","前台打印的第一个数据"+data.get(0).getName());
testHomeText.setText(data.get(0).getName());
}
});
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};