Service使用及注意事项

最近项目中有使用到service,做的时候还是踩了一些坑,相信小伙伴们也一定或多或少踩过,下面就把这些坑记录一下,后续可能会用到,也方便大家。

一、使用篇
Service生命周期想必大家以及非常熟悉了,这边就不详细介绍,有兴趣的朋友可能上官网研究一下。
二、注意事项篇
1、区分startServicebindService
这边总结起来可以用一句话形容,startService调起的Service不受宿主生命周期影响,bindService则受影响。怎么理解呢?譬如一个Activity把一个Service调起,同样在结束调用时解绑Service的条件下,使用StartService的话,Activity被杀掉时,Service还在运行。使用bindService调起则Activity被杀掉时Service也跟着一起挂了。
所以,如果调用startService开启服务,在Activity关闭的时候一定需要手动的调用stopService或者在Service中调用stopSelf亦可以关闭Service,bindService开启服务则在Activity关闭的时候,调用unbindService即可。
2、Service和Activity通信问题
众所周知,binder是service和Activity通信使用的。不过其实通过binder,Activity能知道Service里的一些状态,那么Service如何及时的通知Activity呢?
1)通过binder注册回调接口
2)通过广播的形式
3)通过反射(类似EventBus)
以上三种,通常会使用1)和2),第三种并不常见。
三、分层处理
最近大家都在搞什么MVP的,其实一个小功能也能体现这种分层,下面我就给大家介绍下:
假如我们需要实现一个上传文件的demo,并且要求是可以后台上传。那么首先就要想到,这个必须使用service了。
然后怎么去实现所谓的MVP呢,我们现在选择将Activity作为我们的View层,将Service作为我们的Presenter层,好,基于接口编程,我们也来:
我们先定义两个接口类,IUploadListener和IBinderListener,分别定义如下:

package com.example.solitude.servicedemo;

/**
 * Created by FanSS on 2016/3/13.
 */
public interface IUploadListener {

    /**
     * 开始上传
     */
    void showStartUpload();

    /**
     * 上传成功
     */
    void showUploadSuccess();

    /**
     * 上传失败
     */
    void showUploadFailed();

    /**
     * 取消上传
     */
    void showUploadCancel();
}
package com.example.solitude.servicedemo;

public interface IBinderListener {

    /**
     * 绑定回调监听
     */
    void bindUploadListener(IUploadListener listener);

    /**
     * 解绑回调监听
     */
    void unbindUploadListener();
}

然后Activity和Service初步代码如下:

package com.example.solitude.servicedemo;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;

public class UploadActivity extends AppCompatActivity implements IUploadListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void showStartUpload() {

    }

    @Override
    public void showUploadSuccess() {

    }

    @Override
    public void showUploadFailed() {

    }

    @Override
    public void showUploadCancel() {

    }
}
package com.example.solitude.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class UploadService extends Service {
    private IUploadListener listener;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinderListener();
    }

    public class MyBinderListener extends Binder implements IBinderListener {


        @Override
        public void bindUploadListener(IUploadListener listener) {

        }

        @Override
        public void unbindUploadListener() {

        }
    }
}

在MVP中,view是完全展示视图效果,Presenter处理逻辑,通过上面的接口,想必大家已经能看出来,UploadActivity不关心逻辑,只负责启动UploadService,UploadService负责上传的所有逻辑,成功或者失败通过回调接口通知到View层做出对应的展现,这样就能做到简单的分层,使得逻辑更加清晰。
以上。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值