Android实现Service下载文件,Notification显示下载进度

先放个gif。。最终效果如果:
这里写图片描述

主要演示了android从服务器下载文件,调用Notification显示下载进度,并且在下载完毕以后点击通知会跳转到安装APK的界面,演示是在真实的网络环境中使用真实的URL进行演示,来看看代码:
MainActivity代码非常简单,就是启动一个Service:

public class MainActivity extends AppCompatActivity {
    String download_url="http://shouji.360tpcdn.com/160329/a9037075b8d3aa98fbf6115c54a5b895/com.alensw.PicFolder_4722404.apk";

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

    }
    public void bt_start_service(View view){
        Intent intent=new Intent(this,DownLoadService.class);
        intent.putExtra("download_url",download_url);
        startService(intent);
    }
}

DownLoadService里面,在onStartCommand方法里面是关键代码,调用NotifyUtil这个工具类的“notify_progress”方法去显示一个通知,与此同时开始下载APK文件,DownLoadService代码如下:

public class DownLoadService extends Service {
    String download_url;
    String savePath= Environment.getExternalStorageDirectory()+"/liulan.apk";
    private int requestCode = (int) SystemClock.uptimeMillis();
    private NotifyUtil currentNotify;
    File mFile;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

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


    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mFile=new File(savePath);
        download_url=intent.getStringExtra("download_url");
        Log.e("test","执行onStartCommand");
        //设置想要展示的数据内容
        Intent intent_noti = new Intent();
        intent_noti.setAction(Intent.ACTION_VIEW);
        //文件的类型,从tomcat里面找
        intent_noti.setDataAndType(Uri.fromFile(mFile), "application/vnd.android.package-archive");
        PendingIntent rightPendIntent = PendingIntent.getActivity(this,
                requestCode, intent_noti, PendingIntent.FLAG_UPDATE_CURRENT);
        int smallIcon = R.drawable.xc_smaillicon;
        String ticker = "正在更新快图浏览";
        //实例化工具类,并且调用接口
        NotifyUtil notify7 = new NotifyUtil(this, 7);
        notify7.notify_progress(rightPendIntent, smallIcon, ticker, "快图浏览升级程序", "正在下载中",
                false, false, false, download_url, savePath, new NotifyUtil.DownLoadListener() {
                    @Override
                    public void OnSuccess(File file) {
                        mFile=file;
                        DownLoadService.this.stopSelf();
                    }

                    @Override
                    public void onFailure(Throwable t, int errorNo, String strMsg) {

                    }
                });
        currentNotify = notify7;
        return super.onStartCommand(intent, flags, startId);

    }
}

在调用“notify_progress”方法的时候,已经开始下载文件了,那么下载的代码是什么呢?如下:

public void notify_progress(PendingIntent pendingIntent, int smallIcon,
                                String ticker, String title, String content,
                                boolean sound, boolean vibrate, boolean lights,
                                String download_url, String savePath, final DownLoadListener listener) {

        setCompatBuilder(pendingIntent, smallIcon, ticker, title, content, sound, vibrate, lights);
        /*
         * 因为进度条要实时更新通知栏也就说要不断的发送新的提示,所以这里不建议开启通知声音。
         * 这里是作为范例,给大家讲解下原理。所以发送通知后会听到多次的通知声音。
         */
        FinalHttp fh = new FinalHttp();
        HttpHandler<File> httpHandler=fh.download(download_url,  savePath, new AjaxCallBack<File>() {
            @Override
            public void onLoading(long count, long current) {
                super.onLoading(count, current);
                double a=count;
                double b=current;
                double currentPro=(double)((b/a)*100);
                cBuilder.setProgress(100, (int)currentPro, false);
                sent();
            }

            @Override
            public void onSuccess(File file) {
                super.onSuccess(file);
                cBuilder.setContentText("下载完成").setProgress(0, 0, false);
                sent();
                listener.OnSuccess(file);
            }

            @Override
            public void onFailure(Throwable t, int errorNo, String strMsg) {
                super.onFailure(t, errorNo, strMsg);
                listener.onFailure(t,errorNo,strMsg);
            }

        });


    }

这里用到了afinal.jar
这个jar已经封装好下载的工具类,我们直接拿来用就行。下载成功之后会通过DownLoadListener这个接口回调到DownLoadService里面,最终运行效果就如最上面那个gif动态图运行效果一样。

项目下载地址:点击下载

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 Android 的 `DownloadManager` 来实现下载链接文件显示下载进度。 首先,在 AndroidManifest.xml 文件添加以下权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /> <uses-permission android:name="android.permission.DOWNLOAD_MANAGER" /> ``` 然后,在需要下载的地方使用以下代码: ```java DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); DownloadManager.Request request = new DownloadManager.Request(Uri.parse("下载链接")); request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE) .setAllowedOverRoaming(false) .setTitle("下载标题") .setDescription("下载描述") .setVisibleInDownloadsUi(true) .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "文件名"); long downloadId = downloadManager.enqueue(request); DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(downloadId); Cursor cursor = downloadManager.query(query); if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); if (DownloadManager.STATUS_RUNNING == cursor.getInt(columnIndex)) { int columnTotalSizeIndex = cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES); int columnDownloadedSoFarIndex = cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR); int totalSize = cursor.getInt(columnTotalSizeIndex); int downloadedSoFar = cursor.getInt(columnDownloadedSoFarIndex); float progress = ((float) downloadedSoFar / (float) totalSize) * 100; // 更新下载进度 } } ``` 以上代码会启动下载任务,并在 `DownloadManager` 查询下载进度。可以通过查询到的下载状态和下载进度更新 UI。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值