Service 的两种启动方式以及实操

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、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) {

    }
};

3. 别忘了Service 需要在manifest中注册

总结 点个赞呗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值