Service使用及注意事项

来源:互联网 发布:pb是什么意思网络用语 编辑:程序博客网 时间:2024/04/30 20:15

最近项目中有使用到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
原创粉丝点击