ServiceBestPractice
第二版的代码需要修改两处,第一处位于DownloadService.java
中的getNotification()
方法
private Notification getNotification(String title, int progress) {
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel("download_service", "前台Service通知", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(channel);
}
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "download_service");
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
builder.setContentIntent(pi);
builder.setContentTitle(title);
if (progress > 0) {
// 当progress 大于或等于0时才需要显示下载进度
builder.setContentText(progress + "%");
builder.setProgress(100, progress, false);
}
return builder.build();
}
第二处是权限声明,位于AndroidManifest.xml
中,加入这一行
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
流程分析
- 调用
MainActivity
的onCreate()
方法,绑定布局以及按钮,按钮开始监听点击事件,绑定DownloadService
服务 - 绑定
DownloadService
服务时,会调用onBind()
方法,返回一个绑定器实例downloadBinder
MainActicity
的ServiceConnection
会在服务可连接时调用onServiceConnected
获取到downloadBinder
实例- 监视到点击事件的时候, 会设置下载地址
url
并且调用downloadBinder
的startDownload(url)
方法 startDownload
方法中新建downloadTask
实例并执行,然后在前台通知正在下载,Toast同步推送“正在下载”的消息downloadTask
执行doInBackground()
方法开始下载
坑点
- 断点下载的代码粗心写错了,导致无法断点下载。