服务的最佳实践 项目笔记
上面我们学习的Service服务的基本使用,接下来通过一个具体的下载实例来强化service的使用过程。
1. 新建一个DownloadListener接口
此接口提供了5个方法,用来规范一个网络下载任务常用的5个方法。
public interface DownloadListener {
//定义5个方法
void onProgress(int progress);
void onSuccessed();
void onFiled();
void onPaused();
void onCanceled();
}
注意:没有onStart()方法,应为这个方法会在默认调用线程时开始下载。这个接口将作为参数传递,提供给调用者使用,返回下载结果的。
2. 新建DownloadTask类,继承AsyncTask<String, Integer, Integer>类
此类使用异步的方式,来实现下载功能。默认覆写三个方法,此外,提供两个公共方法给外部调用。
public class DownloadTask extends AsyncTask<String, Integer, Integer> {
private DownloadListener mDownloadListener;
public DownloadTask(DownloadListener listener) {
mDownloadListener = listener;
}
@Override
protected Integer doInBackground(String... strings) {
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
}
//此外,提供两个公共方法,对外使用
//暂停和取消方法
public void onPaused() {
}
public void onCanceled() {
}
}
3. 在Activity中使用startService()方法和bindService()来执行Service
这里注意,使用connection里面获取到前面的DownloadBinder实例,然后直接使用Service提供给Binder内部类方法来控制下载状态。
public class Main2Activity extends AppCompatActivity {
private DownloadService.DownloadBinder mBinder;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mBinder = (DownloadService.DownloadBinder) iBinder;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//分别使用startService和bindService方法,因为,防止被后台停止
//调用mBinder的方法来启动和暂停和取消
String url = ""; //下载地址
mBinder.startDownload(url);
mBinder.pauseDownload();
mBinder.cancelDownload();
}
}
ok,以上为使用Service下载的文件实例的一个思路,本文认为,把这个流程和设计思路掌握本掌握代码本身更重要,更有参考价值。此下载项目的设计模式值得参考,包括使用接口来传递,提供给调用者更多的方法。使用内部类的方式来定义Binder方法。这个方式公开个调用者,让调用者直接调用自己的内部类,这个思路也挺好的。