Android Service 后台下载

服务

import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.IBinder;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by dk on 2016/11/25.
 */

public class DownloadSignatureService extends Service {
    protected static final String fileRootPath = Environment.getExternalStorageDirectory() + File.separator;
    protected static final String fileDownloadPath = "sunrise/download/";
    protected int fileSzie;//文件大小
    protected int fileCache;//文件缓存
    protected String fileName = "";//文件名
    protected String fileNametemp = "";//临时文件
    protected String urlStr = "";//下载url
    protected File downloaddir, downloadfile, downloadfiletemp;
    protected static NotificationManager mNotifyManager;
    protected static NotificationCompat.Builder mBuilder;
    protected static final int notifiID = 0x000;
    protected static final String TAG = "LLL::";

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

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");
        urlStr = (String) intent.getExtras().get("signatureurl");
        Log.e(TAG, "urlStr = " + urlStr);
        /*Signature Download Url*/
        DownloadFile(urlStr);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy");
        super.onDestroy();
    }

    /**
     * Download Signature
     *
     * @param downloadUrl
     */
    protected void DownloadFile(String downloadUrl) {
        Log.e(TAG, "DownloadFile");
        /*文件名*/
        fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1);
        /*缓存文件*/
        fileNametemp = "download.tmp";
        /*下载目录*/
        downloaddir = new File(fileRootPath + fileDownloadPath);
        downloadfile = new File(fileRootPath + fileDownloadPath + fileName);
        downloadfiletemp = new File(fileRootPath + fileDownloadPath + fileNametemp);

        if (!downloaddir.exists()) {
            downloaddir.mkdirs();
        }
        /*如何文件存在 这安装文件*/
        if (downloadfile.exists()) {
            installApp(DownloadSignatureService.this, fileRootPath + fileDownloadPath + fileName);
        }
        /*否则下载文件*/
        else {
            mNotifyManager =
                    (NotificationManager) DownloadSignatureService.this.getSystemService(DownloadSignatureService.this.NOTIFICATION_SERVICE);
            mBuilder = new NotificationCompat.Builder(DownloadSignatureService.this);
            mBuilder.setContentTitle("下载 电子签名App")
                    .setContentText("正在下载···")
                    .setProgress(100, 0, false)
                    .setSmallIcon(android.R.drawable.stat_sys_download);
            //downloadfile
            new AsyncTask<String, Integer, String>() {
                @Override
                protected void onPreExecute() {
                    mBuilder.setTicker("下载电子签名").setProgress(100, 0, false);
                    mNotifyManager.notify(notifiID, mBuilder.build());

                    super.onPreExecute();
                }

                @Override
                protected void onProgressUpdate(Integer... values) {
                    Log.e(TAG, "---下载缓存" + values[0] + "---");
                    int pp = ((values[0] + 1) * 100 / fileSzie);
                    mBuilder.setProgress(100, pp, false).setContentText("已下载" + pp + "%");
                    mNotifyManager.notify(notifiID, mBuilder.build());
                    super.onProgressUpdate(values);
                }

                @Override
                protected String doInBackground(String... params) {
                    try {
                        fileName = params[0].substring(params[0].lastIndexOf("/") + 1);
                        Log.e("LLL", "---fileName = " + fileName);
                        //获取文件名
                        URL myURL = new URL(params[0]);
                        URLConnection conn = myURL.openConnection();
                        conn.setDoInput(true);
                        conn.connect();
                        InputStream is = conn.getInputStream();
                        fileSzie = conn.getContentLength();//根据响应获取文件大小
                        if (fileSzie <= 0) {
                            throw new RuntimeException("无法获知文件大小 ");
                        }
                        if (is == null) throw new RuntimeException("stream is null");
                        /*下载目录*/
                        if (!downloaddir.exists()) {
                            downloaddir.mkdirs();
                        }
                        //把数据存入 路径+文件名
                        FileOutputStream fos = new FileOutputStream(downloadfiletemp);
                        byte buf[] = new byte[1024];
                        fileCache = 0;
                        do {
                            //循环读取
                            int numread = is.read(buf);
                            if (numread == -1) {
                                break;
                            }
                            fos.write(buf, 0, numread);
                            fileCache += numread;
                            this.publishProgress(fileCache);

                        } while (true);

                        try {
                            is.close();
                        } catch (Exception ex) {
                            Log.e("tag", "error: " + ex.getMessage());
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return "下载成功";
                }

                @Override
                protected void onPostExecute(String s) {
                    /*下载成功后*/
                    if (downloadfiletemp.exists()) {
                        downloadfiletemp.renameTo(downloadfile);
                    }
                    Toast.makeText(DownloadSignatureService.this, s, Toast.LENGTH_SHORT).show();
                    /*取消通知*/
                    mBuilder.setContentText(s).setProgress(100, 0, false);
                    mNotifyManager.cancel(notifiID);
                    installApp(DownloadSignatureService.this, fileRootPath + fileDownloadPath + fileName);
                    /*service kill 自杀*/
                    DownloadSignatureService.this.stopSelf();
                    super.onPostExecute(s);
                }
            }.execute(downloadUrl);

        }

    }

    /**
     * install Apk
     *
     * @param context
     * @param filePath
     */
    public void installApp(Context context, String filePath) {
        File _file = new File(filePath);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(Uri.fromFile(_file), "application/vnd.android.package-archive");
        context.startActivity(intent);
    }
}

启动服务
bundle = new Bundle();
bundle.putString("signatureurl", Instance.SignatureUrl“你下载的地址”);/*电子签名下载地址*/
Intent it = new Intent().setClass(ctx, DownloadSignatureService.class).putExtras(bundle);
startService(it);
权限
<!-- 读写存储卡的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 访问联网权限 -->
    <uses-permission android:name="android.permission.INTERNET" />

配置

 <service android:name=".Service.DownloadSignatureService" />

  

 这个已经已经很简单易懂了,可以参考下,下载完成后自动安装,等等,需要的可以看看,
AsyncTask<String, Integer, String>()下载更新ui 
				
时间: 2024-10-15 02:12:21

Android Service 后台下载的相关文章

Android SERVICE后台服务进程的自启动和保持

Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务. Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持,就会被其杀掉. 如何保持Service的运行状态是现在要说明的,核心就是利用ANDROID的系统广播,这一不会被其他软件影响的常驻程序触发自己的程序检查Service的运行

[Android]android Service后台防杀

网上有很多办法,方法一:在JNI里面fork出子进程service在单独的进程中,在service中调用JNI的代码,然后fork出一个进程,然后让我们的service进程和fork出来的子进程一直运行.在5以下是可以的,在5以上无效,5.0的代码:Process.killProcessQuiet(app.pid);Process.killProcessGroup(app.info.uid, app.pid);4.3的代码:Process.killProcessQuiet(pid); http:

Android SERVICE后台服务进程的守护

Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务.而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持,就会被其杀掉. 在早些时候,我们可以通过在 1. service中重写onStartCommand方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动 public int onStartCommand(Intent intent, int flags, int

Android Service 后台服务之本地服务

Service是Android系统的服务组件,适用于开发没有用户界面且长时间在后台运行的功能 - Service简介 因为手机硬件性能和屏幕尺寸的限制,通常Android系统仅允许一个应用程序处于激活状态并显示在手机屏幕上,而暂停其他处于未激活状态的程序. 因此,Android系统需要一种后台服务机制,允许在没有用户界面的情况下,使程序能够长时间在后台运行,实现应用程序的后台服务功能. 在实际应用中,有很多应用需要使用Service,比如MP3播放器要求在关闭播放器界面后,仍然能够后台保持音乐持

Android Notification通知栏 下载控件

开启一个服务,服务中 启动一个通知. 通知中 下载. Android之Notification的多种用法 http://blog.csdn.net/loongggdroid/article/details/17616509 Android多任务下载,使用Notification更新进度条: http://cn23snyga.iteye.com/blog/1902071 Android4.1:通知栏显示可点击的按钮-Notification.builder Sample: http://blog.

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇

android 实现后台服务及源码下载

android APP后台服务可以长期与服务器进行长期的交互,保证数据的实时性,这个小项目主要实现的是在app退出之后依然可以运行服务.使用系统的Intent.ACTION_TIME_TICK进行实现,这个系统的广播每隔一分钟就进行广播一次,可以在程序中接收该广播消息,接收到之后检测app中的service服务是否在运行,如果在运行,则不处理,如果没有运行,则重新启动该service服务. 值得注意的是,虽然本示例可以实现后台运行服务的功能,但是当用户按home键进行清楚内存的时候依然可以把ap

Android 利用Service实现下载网络图片至sdk卡

1 package com.example.myapp5; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 /** 9 * Android 利用service实现下载图片功能 10 * @author shaobn 11 * @date

Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度

在开发过程中,总会需要从网络上下载文件,有时候还需要将下载进度显示在下拉菜单中. 现在写了一个Demo,封装了AsyncTask下载文件和进度显示的代码,以后在做项目的时候能够直接进行使用. 效果图: 主界面只有一个按钮,比较简单: / layout / activity_main.xml : <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="h