service download manager

单例模式-->
public class DownManager1 extends Observable implements Observer, IDownLoad {

    private static String TAG = DownManager1.class.getSimpleName();
    private static DownloadManager downloadManager;
    private Context mContext;
    private long downloadId;
    File file;
    private ApkDownLoadEvent.installInfoBean installInfoBean;
    private DownListener mListener;
    public SimpleBinder mBinder;


    //下载任务接收
    @Subscribe
    public void getDownEvent(ApkDownLoadEvent event) {
        switch (event.getStateType()) {
            case ApkDownLoadEvent.onApkDownStartCommend:
                Log.e(TAG + "DownService", "=======收到下载event=====" + event.getInstallInfoBean().getDownUrl() + "///" + event.getInstallInfoBean().getPosition());
                downApk(event.getInstallInfoBean().getDownUrl(), event.getInstallInfoBean().getPosition());
                break;
        }
    }

    @Override
    public void downLoad(Context context, String url) {

    }

    private static DownManager1 sInstance;
    private static final Object sLock = new Object();

    public static DownManager1 getInstance(Context context) {

        synchronized (sLock) {
            if (null == sInstance) {
                sInstance = new DownManager1(context);
            }
        }
        return sInstance;
    }

    public DownManager1(Context context) {
        mContext = context.getApplicationContext();
        installInfoBean = new ApkDownLoadEvent.installInfoBean();
        InstalledHelper.getInstance(context).addObserver(this);
        CommonEventBus.getEventBus().register(this);
    }

    @Override
    public void addObserver(Observer observer) {
        super.addObserver(observer);
        if (countObservers() > 0) {

        }
    }

    @Override
    public void deleteObserver(Observer observer) {
        super.deleteObserver(observer);
        if (countObservers() == 0) {
            InstalledHelper.getInstance(mContext).deleteObserver(this);
            CommonEventBus.getEventBus().unregister(this);
        }
    }


    public class SimpleBinder extends Binder {
        public DownManager1 getService() {
            return DownManager1.this;
        }
    }

    //监听应用安装
    @Override
    public void update(Observable observable, Object data) {
        if (observable instanceof InstalledHelper) {
            InstalledData installedData = (InstalledData) data;
            if (data instanceof InstalledData) {
                if (installedData.isInstalled()) {
                    installInfoBean.setPackName(((InstalledData) data).getPackageName());
                    CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkInstallFinish, installInfoBean));
                    PackageManager packageManager = mContext.getPackageManager();
                    Intent intent1 = new Intent(Intent.ACTION_MAIN);
                    intent1.addCategory(Intent.CATEGORY_LAUNCHER);
                    intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent1 = packageManager.getLaunchIntentForPackage(installInfoBean.getPackName());
                    mContext.startActivity(intent1);
                    installInfoBean.setPackName(installInfoBean.getPackName());
                    CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkOpened, installInfoBean));
                    if (mListener != null) {
                        mListener.onApkOpened(installInfoBean.getPackName());
                    }
//                    EventBus.getDefault().post(new EventDownload(EventDownload.DONE, installInfoBean.getPackName()));
                }
            }
        } else if (observable instanceof DownLoadHelper) {
            DownedData downedData = (DownedData) data;
            if (data instanceof DownedData) {
                if (downedData.isDowned()) {
                    checkStatus(mContext);
                }
            }
        }
    }

    @SuppressLint("NewApi")
    public void downApk(String url, int listPos) {
        DownLoadHelper.getInstance(mContext).addObserver(this);
        file = new File(mContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), System.currentTimeMillis() + ".apk");
        Log.e("C52_Down" + TAG, "========file======" + file.getAbsolutePath() + "========downApk======" + url + "====pos====" + listPos);
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
        request.setTitle("应用下载中");
        request.setDescription("应用下载中...");
        request.setVisibleInDownloadsUi(true);
        request.setDestinationUri(Uri.fromFile(file));
        if (downloadManager == null)
            downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
        //将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件等等
        if (downloadManager != null) {
            downloadId = downloadManager.enqueue(request);

            installInfoBean.setDownLoadId(downloadId);
            installInfoBean.setApkPath(file.getAbsolutePath());
            installInfoBean.setPosition(listPos);
            CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkDownStart, installInfoBean));
            if (mListener != null) {
                mListener.onAapkStartDown(downloadId, listPos, file.getAbsolutePath());
            }
        }
    }


    private void checkStatus(Context context) {
        try {
            DownloadManager.Query query = new DownloadManager.Query();
            //通过下载的id查找
            query.setFilterById(downloadId);
            Cursor cursor = downloadManager.query(query);
            if (cursor != null && cursor.moveToFirst()) {
                int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
                switch (status) {
                    //下载暂停
                    case DownloadManager.STATUS_PAUSED:
                        break;
                    //下载延迟
                    case DownloadManager.STATUS_PENDING:
                        break;
                    //正在下载
                    case DownloadManager.STATUS_RUNNING:
                        Log.e(TAG, "dwonLoadId-->" + downloadId + "  正在下载" + getDownloadPercent(downloadId));
                        getDownloadPercent(downloadId);
                        break;
                    case DownloadManager.STATUS_FAILED:
                        CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkDownError, installInfoBean));
                        if (mListener != null) {
                            mListener.onApkDownError();
                        }
                        Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show();
                        cursor.close();
                        break;
                    case DownloadManager.STATUS_SUCCESSFUL:
                        installInfoBean.setDownLoadId(downloadId);
                        CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkDownFinish, installInfoBean));
                        if (mListener != null) {
                            mListener.onAdpkDowned(downloadId);
                        }
                        Log.e(TAG, "dwonLoadId-->" + downloadId + "  下载完成" + getDownloadPercent(downloadId));
                        ApkUtils.installApk(file.getAbsolutePath(), context);
                        cursor.close();
                        DownLoadHelper.getInstance(mContext).deleteObserver(this);
                        break;

                    default:
                        break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static int getDownloadPercent(long downloadId) {
        try {
            DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
            if (downloadManager != null) {
                Cursor c = downloadManager.query(query);
                if (c != null && c.moveToFirst()) {
                    int downloadBytesIdx = c.getColumnIndexOrThrow(
                            DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);
                    int totalBytesIdx = c.getColumnIndexOrThrow(
                            DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
                    long totalBytes = c.getLong(totalBytesIdx);
                    long downloadBytes = c.getLong(downloadBytesIdx);
                    return (int) (downloadBytes * 100 / totalBytes);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public void setOnDownListener(DownListener apkListener) {
        this.mListener = apkListener;
    }

    public static boolean checkAppInstalled(Context context, String pkgName) {
        if (pkgName == null || pkgName.isEmpty()) {
            return false;
        }
        final PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> info = packageManager.getInstalledPackages(0);
        if (info == null || info.isEmpty()) {
            return false;
        }
        for (int i = 0; i < info.size(); i++) {
            if (pkgName.equals(info.get(i).packageName)) {
                return true;
            }
        }
        return false;
    }
}

 

--->service

try {
    Intent intent = new Intent(getContext(), DownManager.class);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        getContext().startForegroundService(intent);
    }
    getContext().startService(intent);
    //  getContext().bindService(intent, conn, Service.BIND_AUTO_CREATE);
} catch (Exception e) {
}

 

 

public class DownManager extends Service implements Observer, IDownLoad {

    private static String TAG = DownManager.class.getSimpleName();
    private static DownloadManager downloadManager;
    private Context mContext;
    private long downloadId;
    private int listPos = 0;
    File file;
    private ApkDownLoadEvent.installInfoBean installInfoBean;

    private DownListener mListener;

    public SimpleBinder mBinder;


    //下载任务接收
    @Subscribe
    public void getDownEvent(ApkDownLoadEvent event) {
        switch (event.getStateType()) {
            case ApkDownLoadEvent.onApkDownStartCommend:
                Log.e(TAG + "DownService", "=======收到下载event=====" + event.getInstallInfoBean().getDownUrl() + "///" + event.getInstallInfoBean().getPosition());
                downApk(event.getInstallInfoBean().getDownUrl(), event.getInstallInfoBean().getPosition());
                break;
        }
    }

    @Override
    public void downLoad(Context context, String url) {

    }

    @Override
    public void onCreate() {
        super.onCreate();
        mBinder = new SimpleBinder();
        mContext = this;
        installInfoBean = new ApkDownLoadEvent.installInfoBean();
        InstalledHelper.getInstance(this).addObserver(this);
        CommonEventBus.getEventBus().register(this);
        Log.e(TAG + "DownService", "=======onCreate======");
        //String url = "http://imtt.dd.qq.com/16891/apk/6EAF79D82F2629293A11ACC85B0F537D.apk?fsname=com.tencent.qqlive_7.7.0.20412_20412.apk&csr=9ee4";
        //downApk(url);
    }

    @Override

    public IBinder onBind(Intent intent) {
        if (mBinder != null) {
            return mBinder;
        }
        return null;
    }

    public class SimpleBinder extends Binder {
        public DownManager getService() {
            return DownManager.this;
        }
    }

    public DownManager() {
        super();
    }

    public class DownloadBinder extends Binder {
        /**
         * 返回当前服务的实例       
         */
        public DownManager getService() {
            return DownManager.this;
        }
    }

    //监听应用安装
    @Override
    public void update(Observable observable, Object data) {
        if (observable instanceof InstalledHelper) {
            InstalledData installedData = (InstalledData) data;
            if (data instanceof InstalledData) {
                if (installedData.isInstalled()) {
                    installInfoBean.setPackName(((InstalledData) data).getPackageName());
                    CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkInstallFinish, installInfoBean));
                    PackageManager packageManager = getPackageManager();
                    Intent intent1 = new Intent(Intent.ACTION_MAIN);
                    intent1.addCategory(Intent.CATEGORY_LAUNCHER);
                    intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent1 = packageManager.getLaunchIntentForPackage(installInfoBean.getPackName());
                    mContext.startActivity(intent1);
                    installInfoBean.setPackName(installInfoBean.getPackName());
                    CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkOpened, installInfoBean));
                    if (mListener != null) {
                        mListener.onApkOpened(installInfoBean.getPackName());
                    }
//                    EventBus.getDefault().post(new EventDownload(EventDownload.DONE, installInfoBean.getPackName()));
                }
            }
        } else if (observable instanceof DownLoadHelper) {
            DownedData downedData = (DownedData) data;
            if (data instanceof DownedData) {
                if (downedData.isDowned()) {
                    checkStatus(mContext);
                }
            }
        }
    }

    @SuppressLint("NewApi")
    public void downApk(String url, int listPos) {
        DownLoadHelper.getInstance(this).addObserver(this);
        file = new File(mContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), System.currentTimeMillis() + ".apk");
        Log.e("C52_Down" + TAG, "========file======" + file.getAbsolutePath() + "========downApk======" + url + "====pos====" + listPos);
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
        request.setTitle("应用下载中");
        request.setDescription("应用下载中...");
        request.setVisibleInDownloadsUi(true);
        request.setDestinationUri(Uri.fromFile(file));
        if (downloadManager == null)
            downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
        //将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件等等
        if (downloadManager != null) {
            downloadId = downloadManager.enqueue(request);

            installInfoBean.setDownLoadId(downloadId);
            installInfoBean.setApkPath(file.getAbsolutePath());
            installInfoBean.setPosition(listPos);
            CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkDownStart, installInfoBean));
            if (mListener != null) {
                mListener.onAapkStartDown(downloadId, listPos, file.getAbsolutePath());
            }
        }
    }


    private void checkStatus(Context context) {
        try {
            DownloadManager.Query query = new DownloadManager.Query();
            //通过下载的id查找
            query.setFilterById(downloadId);
            Cursor cursor = downloadManager.query(query);
            if (cursor != null && cursor.moveToFirst()) {
                int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
                switch (status) {
                    //下载暂停
                    case DownloadManager.STATUS_PAUSED:
                        break;
                    //下载延迟
                    case DownloadManager.STATUS_PENDING:
                        break;
                    //正在下载
                    case DownloadManager.STATUS_RUNNING:
                        Log.e(TAG, "dwonLoadId-->" + downloadId + "  正在下载" + getDownloadPercent(downloadId));
                        getDownloadPercent(downloadId);
                        break;
                    case DownloadManager.STATUS_FAILED:
                        CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkDownError, installInfoBean));
                        if (mListener != null) {
                            mListener.onApkDownError();
                        }
                        Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show();
                        cursor.close();
                        break;
                    case DownloadManager.STATUS_SUCCESSFUL:
                        installInfoBean.setDownLoadId(downloadId);
                        CommonEventBus.getEventBus().post(new ApkDownLoadEvent(ApkDownLoadEvent.onApkDownFinish, installInfoBean));
                        if (mListener != null) {
                            mListener.onAdpkDowned(downloadId);
                        }
                        Log.e(TAG, "dwonLoadId-->" + downloadId + "  下载完成" + getDownloadPercent(downloadId));
                        ApkUtils.installApk(file.getAbsolutePath(), context);
                        cursor.close();
                        DownLoadHelper.getInstance(this).deleteObserver(this);
                        break;

                    default:
                        break;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static int getDownloadPercent(long downloadId) {
        try {
            DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
            if (downloadManager != null) {
                Cursor c = downloadManager.query(query);
                if (c != null && c.moveToFirst()) {
                    int downloadBytesIdx = c.getColumnIndexOrThrow(
                            DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);
                    int totalBytesIdx = c.getColumnIndexOrThrow(
                            DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
                    long totalBytes = c.getLong(totalBytesIdx);
                    long downloadBytes = c.getLong(downloadBytesIdx);
                    return (int) (downloadBytes * 100 / totalBytes);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public void setOnDownListener(DownListener apkListener) {
        this.mListener = apkListener;
    }

    public static boolean checkAppInstalled(Context context, String pkgName) {
        if (pkgName == null || pkgName.isEmpty()) {
            return false;
        }
        final PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> info = packageManager.getInstalledPackages(0);
        if (info == null || info.isEmpty()) {
            return false;
        }
        for (int i = 0; i < info.size(); i++) {
            if (pkgName.equals(info.get(i).packageName)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        InstalledHelper.getInstance(this).deleteObserver(this);
        CommonEventBus.getEventBus().unregister(this);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值