Android 演示 DownloadManager 下载

本文内容

  • 环境
  • 项目结构
  • 演示下载
  • 参考资料

本文是 github 上 Trinea-commonTrinea-Demo 项目的一部分。(不知道此人攒了多久~

假设,现在有个下载 apk 包的需求,你大概能想到什么?

  • 下载本身;
  • 下载进度;
  • 期间还能取消;
  • 由于网络不好或中断,下载失败,还要能重试;
  • 因为下载的是 apk,下载完还要能提示安装更好,而且,很多手机管理 app,还能静默安装;
  • 还能在手机通知栏看到下载提示;
  • 这些就涉及到 android.app.DownloadManagerandroid.content.BroadcastReceiverandroid.os.Handler

自己下载 Demo 调试一下~

下载 Demo

更多 Demo

环境


  • Windows 2008 R2 64 位

  • Eclipse ADT V22.6.2,Android 4.4.2(API 19)
  • SAMSUNG GT-8618,Android OS 4.1.2

项目结构



图 1 项目结构

图 2 主程序

图 3 下载

(注意:顶部通知栏,是有下载图标的~)

package com.example.download.ui;
 

import java.io.File;

import java.text.DecimalFormat;

import com.example.download.R;

import com.example.download.utils.DownloadManagerPro;

import com.example.download.utils.PreferencesUtils;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.app.DownloadManager;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.database.ContentObserver;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ProgressBar;

import android.widget.TextView;

import android.widget.Toast;

 

/**

 * DownloadManagerDemo

 * 

 * @author LN 

 * @since 2014-1-8

 * @version 1.0

 */

public class DownloadManagerDemo extends Activity {

 

    public static final String DOWNLOAD_FOLDER_NAME = "Trinea";

    public static final String DOWNLOAD_FILE_NAME = "MeiLiShuo.apk";

 

    public static final String APK_URL = "http://img.meilishuo.net/css/images/AndroidShare/Meilishuo_3.6.1_10006.apk";

    public static final String KEY_NAME_DOWNLOAD_ID = "downloadId";

 

    private Button downloadButton;

    private ProgressBar downloadProgress;

    private TextView downloadTip;

    private TextView downloadSize;

    private TextView downloadPrecent;

    private Button downloadCancel;

 

    private DownloadManager downloadManager;

    private DownloadManagerPro downloadManagerPro;

    private long downloadId = 0;

 

    private MyHandler handler;

 

    private DownloadChangeObserver downloadObserver;

    private CompleteReceiver completeReceiver;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        

        setContentView(R.layout.download_manager_demo);

        

        handler = new MyHandler();

        downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

        downloadManagerPro = new DownloadManagerPro(downloadManager);

 

        // see android mainfest.xml, 

        // accept minetype of cn.trinea.download.file

        Intent intent = getIntent();

        if (intent != null) {

            /**

             * below android 4.2, intent.getDataString() is

             * file:///storage/sdcard1/Trinea/MeLiShuo.apk<br/>

             * equal or above 4.2 intent.getDataString() is

             * content://media/external/file/29669

             */

            Uri data = intent.getData();

            if (data != null) {

                Toast.makeText(getApplicationContext(), data.toString(), Toast.LENGTH_LONG)

                        .show();

            }

        }

 

        initView();

        initData();

 

        downloadObserver = new DownloadChangeObserver();

        completeReceiver = new CompleteReceiver();

        /** register download success broadcast **/

        registerReceiver(completeReceiver, new IntentFilter(

                DownloadManager.ACTION_DOWNLOAD_COMPLETE));

    }

 

    @Override

    protected void onResume() {

        super.onResume();

        /** observer download change **/

        getContentResolver().registerContentObserver(

                DownloadManagerPro.CONTENT_URI, true, downloadObserver);

        updateView();

    }

 

    @Override

    protected void onPause() {

        super.onPause();

        getContentResolver().unregisterContentObserver(downloadObserver);

    }

 

    @Override

    protected void onDestroy() {

        super.onDestroy();

        unregisterReceiver(completeReceiver);

    }

 

    private void initView() {

        downloadButton = (Button) findViewById(R.id.download_button);

        downloadCancel = (Button) findViewById(R.id.download_cancel);

        downloadProgress = (ProgressBar) findViewById(R.id.download_progress);

        downloadTip = (TextView) findViewById(R.id.download_tip);

        downloadTip

                .setText(getString(R.string.tip_download_file)

                        + Environment

                                .getExternalStoragePublicDirectory(DOWNLOAD_FOLDER_NAME));

        downloadSize = (TextView) findViewById(R.id.download_size);

        downloadPrecent = (TextView) findViewById(R.id.download_precent);

    }

 

    private void initData() {

        /**

         * get download id from preferences.<br/>

         * if download id bigger than 0, means it has been downloaded, then

         * query status and show right text;

         */

        downloadId = PreferencesUtils.getLong(getApplicationContext(), KEY_NAME_DOWNLOAD_ID);

        updateView();

        downloadButton.setOnClickListener(new OnClickListener() {

 

            @Override

            public void onClick(View v) {

                File folder = new File(DOWNLOAD_FOLDER_NAME);

                if (!folder.exists() || !folder.isDirectory()) {

                    folder.mkdirs();

                }

 

                DownloadManager.Request request = new DownloadManager.Request(

                        Uri.parse(APK_URL));

                request.setDestinationInExternalPublicDir(DOWNLOAD_FOLDER_NAME,

                        DOWNLOAD_FILE_NAME);

                request.setTitle(getString(R.string.download_notification_title));

                request.setDescription("meilishuo desc");

                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

                request.setVisibleInDownloadsUi(false);

                // request.allowScanningByMediaScanner();

                // request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);

                // request.setShowRunningNotification(false);

                // request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);

                request.setMimeType("application/cn.trinea.download.file");

                

                downloadId = downloadManager.enqueue(request);

                /** save download id to preferences **/

                PreferencesUtils.putLong(getApplicationContext(), KEY_NAME_DOWNLOAD_ID,

                        downloadId);

                updateView();

            }

        });

        downloadCancel.setOnClickListener(new OnClickListener() {

 

            @Override

            public void onClick(View v) {

                downloadManager.remove(downloadId);

                updateView();

            }

        });

    }

 

    /**

     * install app

     * 

     * @param context

     * @param filePath

     * @return whether apk exist

     */

    public static boolean install(Context context, String filePath) {

        Intent i = new Intent(Intent.ACTION_VIEW);

        File file = new File(filePath);

        if (file != null && file.length() > 0 && file.exists() && file.isFile()) {

            i.setDataAndType(Uri.parse("file://" + filePath),

                    "application/vnd.android.package-archive");

            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            context.startActivity(i);

            return true;

        }

        return false;

    }

 

    class DownloadChangeObserver extends ContentObserver {

 

        public DownloadChangeObserver() {

            super(handler);

        }

 

        @Override

        public void onChange(boolean selfChange) {

            updateView();

        }

 

    }

 

    class CompleteReceiver extends BroadcastReceiver {

 

        @Override

        public void onReceive(Context context, Intent intent) {

            /**

             * get the id of download which have download success, if the id is

             * my id and it‘s status is successful, then install it

             **/

            long completeDownloadId = intent.getLongExtra(

                    DownloadManager.EXTRA_DOWNLOAD_ID, -1);

            if (completeDownloadId == downloadId) {

                initData();

                updateView();

                // if download successful, install apk

                if (downloadManagerPro.getStatusById(downloadId) == DownloadManager.STATUS_SUCCESSFUL) {

                    String apkFilePath = new StringBuilder(Environment

                            .getExternalStorageDirectory().getAbsolutePath())

                            .append(File.separator)

                            .append(DOWNLOAD_FOLDER_NAME)

                            .append(File.separator).append(DOWNLOAD_FILE_NAME)

                            .toString();

                    install(context, apkFilePath);

                }

            }

        }

    };

 

    public void updateView() {

        int[] bytesAndStatus = downloadManagerPro.getBytesAndStatus(downloadId);

        handler.sendMessage(handler.obtainMessage(0, bytesAndStatus[0],

                bytesAndStatus[1], bytesAndStatus[2]));

    }

 

    @SuppressLint("HandlerLeak")

    private class MyHandler extends Handler {

 

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

 

            switch (msg.what) {

            case 0:

                int status = (Integer) msg.obj;

                if (isDownloading(status)) {

                    downloadProgress.setVisibility(View.VISIBLE);

                    downloadProgress.setMax(0);

                    downloadProgress.setProgress(0);

                    downloadButton.setVisibility(View.GONE);

                    downloadSize.setVisibility(View.VISIBLE);

                    downloadPrecent.setVisibility(View.VISIBLE);

                    downloadCancel.setVisibility(View.VISIBLE);

 

                    if (msg.arg2 < 0) {

                        downloadProgress.setIndeterminate(true);

                        downloadPrecent.setText("0%");

                        downloadSize.setText("0M/0M");

                    } else {

                        downloadProgress.setIndeterminate(false);

                        downloadProgress.setMax(msg.arg2);

                        downloadProgress.setProgress(msg.arg1);

                        downloadPrecent.setText(getNotiPercent(msg.arg1,

                                msg.arg2));

                        downloadSize.setText(getAppSize(msg.arg1) + "/"

                                + getAppSize(msg.arg2));

                    }

                } else {

                    downloadProgress.setVisibility(View.GONE);

                    downloadProgress.setMax(0);

                    downloadProgress.setProgress(0);

                    downloadButton.setVisibility(View.VISIBLE);

                    downloadSize.setVisibility(View.GONE);

                    downloadPrecent.setVisibility(View.GONE);

                    downloadCancel.setVisibility(View.GONE);

 

                    if (status == DownloadManager.STATUS_FAILED) {

                        downloadButton

                                .setText(getString(R.string.app_status_download_fail));

                    } else if (status == DownloadManager.STATUS_SUCCESSFUL) {

                        downloadButton

                                .setText(getString(R.string.app_status_downloaded));

                    } else {

                        downloadButton

                                .setText(getString(R.string.app_status_download));

                    }

                }

                break;

            }

        }

    }

 

    static final DecimalFormat DOUBLE_DECIMAL_FORMAT = new DecimalFormat("0.##");

 

    public static final int MB_2_BYTE = 1024 * 1024;

    public static final int KB_2_BYTE = 1024;

 

    /**

     * @param size

     * @return

     */

    public static CharSequence getAppSize(long size) {

        if (size <= 0) {

            return "0M";

        }

 

        if (size >= MB_2_BYTE) {

            return new StringBuilder(16).append(

                    DOUBLE_DECIMAL_FORMAT.format((double) size / MB_2_BYTE))

                    .append("M");

        } else if (size >= KB_2_BYTE) {

            return new StringBuilder(16).append(

                    DOUBLE_DECIMAL_FORMAT.format((double) size / KB_2_BYTE))

                    .append("K");

        } else {

            return size + "B";

        }

    }

 

    public static String getNotiPercent(long progress, long max) {

        int rate = 0;

        if (progress <= 0 || max <= 0) {

            rate = 0;

        } else if (progress > max) {

            rate = 100;

        } else {

            rate = (int) ((double) progress / max * 100);

        }

        return new StringBuilder(16).append(rate).append("%").toString();

    }

 

    public static boolean isDownloading(int downloadManagerStatus) {

        return downloadManagerStatus == DownloadManager.STATUS_RUNNING

                || downloadManagerStatus == DownloadManager.STATUS_PAUSED

                || downloadManagerStatus == DownloadManager.STATUS_PENDING;

    }

}

以及自定义的 DownloadManagerPro 和 PreferencesUtils 类,代码如下所示:

package com.example.download.utils;
 

import java.lang.reflect.Method;

 

import android.app.DownloadManager;

import android.app.DownloadManager.Request;

import android.database.Cursor;

import android.net.Uri;

import android.os.Build;

 

/**

 * DownloadManagerPro

 */

public class DownloadManagerPro {

 

    public static final Uri CONTENT_URI = Uri

            .parse("content://downloads/my_downloads");

    /** represents downloaded file above api 11 **/

    public static final String COLUMN_LOCAL_FILENAME = "local_filename";

    /** represents downloaded file below api 11 **/

    public static final String COLUMN_LOCAL_URI = "local_uri";

 

    public static final String METHOD_NAME_PAUSE_DOWNLOAD = "pauseDownload";

    public static final String METHOD_NAME_RESUME_DOWNLOAD = "resumeDownload";

 

    private static boolean isInitPauseDownload = false;

    private static boolean isInitResumeDownload = false;

 

    private static Method pauseDownload = null;

    private static Method resumeDownload = null;

 

    private DownloadManager downloadManager;

 

    public DownloadManagerPro(DownloadManager downloadManager) {

        this.downloadManager = downloadManager;

    }

 

    /**

     * get download status

     * 

     * @param downloadId

     * @return

     */

    public int getStatusById(long downloadId) {

        return getInt(downloadId, DownloadManager.COLUMN_STATUS);

    }

 

    /**

     * get downloaded byte, total byte

     * 

     * @param downloadId

     * @return a int array with two elements

     *         <ul>

     *         <li>result[0] represents downloaded bytes, This will initially be

     *         -1.</li>

     *         <li>result[1] represents total bytes, This will initially be -1.</li>

     *         </ul>

     */

    public int[] getDownloadBytes(long downloadId) {

        int[] bytesAndStatus = getBytesAndStatus(downloadId);

        return new int[] { bytesAndStatus[0], bytesAndStatus[1] };

    }

 

    /**

     * get downloaded byte, total byte and download status

     * 

     * @param downloadId

     * @return a int array with three elements

     *         <ul>

     *         <li>result[0] represents downloaded bytes, This will initially be

     *         -1.</li>

     *         <li>result[1] represents total bytes, This will initially be -1.</li>

     *         <li>result[2] represents download status, This will initially be

     *         0.</li>

     *         </ul>

     */

    public int[] getBytesAndStatus(long downloadId) {

        int[] bytesAndStatus = new int[] { -1, -1, 0 };

        DownloadManager.Query query = new DownloadManager.Query()

                .setFilterById(downloadId);

        Cursor c = null;

        try {

            c = downloadManager.query(query);

            if (c != null && c.moveToFirst()) {

                bytesAndStatus[0] = c

                        .getInt(c

                                .getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));

                bytesAndStatus[1] = c

                        .getInt(c

                                .getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));

                bytesAndStatus[2] = c.getInt(c

                        .getColumnIndex(DownloadManager.COLUMN_STATUS));

            }

        } finally {

            if (c != null) {

                c.close();

            }

        }

        return bytesAndStatus;

    }

 

    /**

     * pause download

     * 

     * @param ids

     *            the IDs of the downloads to be paused

     * @return the number of downloads actually paused, -1 if exception or

     *         method not exist

     */

    public int pauseDownload(long... ids) {

        initPauseMethod();

        if (pauseDownload == null) {

            return -1;

        }

 

        try {

            return ((Integer) pauseDownload.invoke(downloadManager, ids))

                    .intValue();

        } catch (Exception e) {

            /**

             * accept all exception, include ClassNotFoundException,

             * NoSuchMethodException, InvocationTargetException,

             * NullPointException

             */

            e.printStackTrace();

        }

        return -1;

    }

 

    /**

     * resume download

     * 

     * @param ids

     *            the IDs of the downloads to be resumed

     * @return the number of downloads actually resumed, -1 if exception or

     *         method not exist

     */

    public int resumeDownload(long... ids) {

        initResumeMethod();

        if (resumeDownload == null) {

            return -1;

        }

 

        try {

            return ((Integer) resumeDownload.invoke(downloadManager, ids))

                    .intValue();

        } catch (Exception e) {

            /**

             * accept all exception, include ClassNotFoundException,

             * NoSuchMethodException, InvocationTargetException,

             * NullPointException

             */

            e.printStackTrace();

        }

        return -1;

    }

 

    /**

     * whether exist pauseDownload and resumeDownload method in

     * {@link DownloadManager}

     * 

     * @return

     */

    public static boolean isExistPauseAndResumeMethod() {

        initPauseMethod();

        initResumeMethod();

        return pauseDownload != null && resumeDownload != null;

    }

 

    private static void initPauseMethod() {

        if (isInitPauseDownload) {

            return;

        }

 

        isInitPauseDownload = true;

        try {

            pauseDownload = DownloadManager.class.getMethod(

                    METHOD_NAME_PAUSE_DOWNLOAD, long[].class);

        } catch (Exception e) {

            // accept all exception

            e.printStackTrace();

        }

    }

 

    private static void initResumeMethod() {

        if (isInitResumeDownload) {

            return;

        }

 

        isInitResumeDownload = true;

        try {

            resumeDownload = DownloadManager.class.getMethod(

                    METHOD_NAME_RESUME_DOWNLOAD, long[].class);

        } catch (Exception e) {

            // accept all exception

            e.printStackTrace();

        }

    }

 

    /**

     * get download file name

     * 

     * @param downloadId

     * @return

     */

    public String getFileName(long downloadId) {

        return getString(

                downloadId,

                (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB ? COLUMN_LOCAL_URI

                        : COLUMN_LOCAL_FILENAME));

    }

 

    /**

     * get download uri

     * 

     * @param downloadId

     * @return

     */

    public String getUri(long downloadId) {

        return getString(downloadId, DownloadManager.COLUMN_URI);

    }

 

    /**

     * get failed code or paused reason

     * 

     * @param downloadId

     * @return <ul>

     *         <li>if status of downloadId is

     *         {@link DownloadManager#STATUS_PAUSED}, return

     *         {@link #getPausedReason(long)}</li>

     *         <li>if status of downloadId is

     *         {@link DownloadManager#STATUS_FAILED}, return

     *         {@link #getErrorCode(long)}</li>

     *         <li>if status of downloadId is neither

     *         {@link DownloadManager#STATUS_PAUSED} nor

     *         {@link DownloadManager#STATUS_FAILED}, return 0</li>

     *         </ul>

     */

    public int getReason(long downloadId) {

        return getInt(downloadId, DownloadManager.COLUMN_REASON);

    }

 

    /**

     * get paused reason

     * 

     * @param downloadId

     * @return <ul>

     *         <li>if status of downloadId is

     *         {@link DownloadManager#STATUS_PAUSED}, return one of

     *         {@link DownloadManager#PAUSED_WAITING_TO_RETRY}<br/>

     *         {@link DownloadManager#PAUSED_WAITING_FOR_NETWORK}<br/>

     *         {@link DownloadManager#PAUSED_QUEUED_FOR_WIFI}<br/>

     *         {@link DownloadManager#PAUSED_UNKNOWN}</li>

     *         <li>else return {@link DownloadManager#PAUSED_UNKNOWN}</li>

     *         </ul>

     */

    public int getPausedReason(long downloadId) {

        return getInt(downloadId, DownloadManager.COLUMN_REASON);

    }

 

    /**

     * get failed error code

     * 

     * @param downloadId

     * @return one of {@link DownloadManager#ERROR_*}

     */

    public int getErrorCode(long downloadId) {

        return getInt(downloadId, DownloadManager.COLUMN_REASON);

    }

 

    public static class RequestPro extends DownloadManager.Request {

 

        public static final String METHOD_NAME_SET_NOTI_CLASS = "setNotiClass";

        public static final String METHOD_NAME_SET_NOTI_EXTRAS = "setNotiExtras";

 

        private static boolean isInitNotiClass = false;

        private static boolean isInitNotiExtras = false;

 

        private static Method setNotiClass = null;

        private static Method setNotiExtras = null;

 

        /**

         * @param uri

         *            the HTTP URI to download.

         */

        public RequestPro(Uri uri) {

            super(uri);

        }

 

        /**

         * set noti class, only init once

         * 

         * @param className

         *            full class name

         */

        public void setNotiClass(String className) {

            synchronized (this) {

 

                if (!isInitNotiClass) {

                    isInitNotiClass = true;

                    try {

                        setNotiClass = Request.class.getMethod(

                                METHOD_NAME_SET_NOTI_CLASS, CharSequence.class);

                    } catch (Exception e) {

                        // accept all exception

                        e.printStackTrace();

                    }

                }

            }

 

            if (setNotiClass != null) {

                try {

                    setNotiClass.invoke(this, className);

                } catch (Exception e) {

                    /**

                     * accept all exception, include ClassNotFoundException,

                     * NoSuchMethodException, InvocationTargetException,

                     * NullPointException

                     */

                    e.printStackTrace();

                }

            }

        }

 

        /**

         * set noti extras, only init once

         * 

         * @param extras

         */

        public void setNotiExtras(String extras) {

            synchronized (this) {

 

                if (!isInitNotiExtras) {

                    isInitNotiExtras = true;

                    try {

                        setNotiExtras = Request.class

                                .getMethod(METHOD_NAME_SET_NOTI_EXTRAS,

                                        CharSequence.class);

                    } catch (Exception e) {

                        // accept all exception

                        e.printStackTrace();

                    }

                }

            }

 

            if (setNotiExtras != null) {

                try {

                    setNotiExtras.invoke(this, extras);

                } catch (Exception e) {

                    /**

                     * accept all exception, include ClassNotFoundException,

                     * NoSuchMethodException, InvocationTargetException,

                     * NullPointException

                     */

                    e.printStackTrace();

                }

            }

        }

    }

 

    /**

     * get string column

     * 

     * @param downloadId

     * @param columnName

     * @return

     */

    private String getString(long downloadId, String columnName) {

        DownloadManager.Query query = new DownloadManager.Query()

                .setFilterById(downloadId);

        String result = null;

        Cursor c = null;

        try {

            c = downloadManager.query(query);

            if (c != null && c.moveToFirst()) {

                result = c.getString(c.getColumnIndex(columnName));

            }

        } finally {

            if (c != null) {

                c.close();

            }

        }

        return result;

    }

 

    /**

     * get int column

     * 

     * @param downloadId

     * @param columnName

     * @return

     */

    private int getInt(long downloadId, String columnName) {

        DownloadManager.Query query = new DownloadManager.Query()

                .setFilterById(downloadId);

        int result = -1;

        Cursor c = null;

        try {

            c = downloadManager.query(query);

            if (c != null && c.moveToFirst()) {

                result = c.getInt(c.getColumnIndex(columnName));

            }

        } finally {

            if (c != null) {

                c.close();

            }

        }

        return result;

    }

}

package com.example.download.utils;

 

import android.content.Context;

import android.content.SharedPreferences;

 

/**

 * PreferencesUtils, easy to get or put data

 */

public class PreferencesUtils {

 

    public static String PREFERENCE_NAME = "TrineaAndroidCommon";

 

    /**

     * put string preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to modify

     * @param value

     *            The new value for the preference

     * @return True if the new values were successfully written to persistent

     *         storage.

     */

    public static boolean putString(Context context, String key, String value) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = settings.edit();

        editor.putString(key, value);

        return editor.commit();

    }

 

    /**

     * get string preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @return The preference value if it exists, or null. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a string

     * @see #getString(Context, String, String)

     */

    public static String getString(Context context, String key) {

        return getString(context, key, null);

    }

 

    /**

     * get string preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @param defaultValue

     *            Value to return if this preference does not exist

     * @return The preference value if it exists, or defValue. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a string

     */

    public static String getString(Context context, String key,

            String defaultValue) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        return settings.getString(key, defaultValue);

    }

 

    /**

     * put int preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to modify

     * @param value

     *            The new value for the preference

     * @return True if the new values were successfully written to persistent

     *         storage.

     */

    public static boolean putInt(Context context, String key, int value) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = settings.edit();

        editor.putInt(key, value);

        return editor.commit();

    }

 

    /**

     * get int preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @return The preference value if it exists, or -1. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a int

     * @see #getInt(Context, String, int)

     */

    public static int getInt(Context context, String key) {

        return getInt(context, key, -1);

    }

 

    /**

     * get int preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @param defaultValue

     *            Value to return if this preference does not exist

     * @return The preference value if it exists, or defValue. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a int

     */

    public static int getInt(Context context, String key, int defaultValue) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        return settings.getInt(key, defaultValue);

    }

 

    /**

     * put long preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to modify

     * @param value

     *            The new value for the preference

     * @return True if the new values were successfully written to persistent

     *         storage.

     */

    public static boolean putLong(Context context, String key, long value) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = settings.edit();

        editor.putLong(key, value);

        return editor.commit();

    }

 

    /**

     * get long preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @return The preference value if it exists, or -1. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a long

     * @see #getLong(Context, String, long)

     */

    public static long getLong(Context context, String key) {

        return getLong(context, key, -1);

    }

 

    /**

     * get long preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @param defaultValue

     *            Value to return if this preference does not exist

     * @return The preference value if it exists, or defValue. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a long

     */

    public static long getLong(Context context, String key, long defaultValue) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        return settings.getLong(key, defaultValue);

    }

 

    /**

     * put float preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to modify

     * @param value

     *            The new value for the preference

     * @return True if the new values were successfully written to persistent

     *         storage.

     */

    public static boolean putFloat(Context context, String key, float value) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = settings.edit();

        editor.putFloat(key, value);

        return editor.commit();

    }

 

    /**

     * get float preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @return The preference value if it exists, or -1. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a float

     * @see #getFloat(Context, String, float)

     */

    public static float getFloat(Context context, String key) {

        return getFloat(context, key, -1);

    }

 

    /**

     * get float preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @param defaultValue

     *            Value to return if this preference does not exist

     * @return The preference value if it exists, or defValue. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a float

     */

    public static float getFloat(Context context, String key, float defaultValue) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        return settings.getFloat(key, defaultValue);

    }

 

    /**

     * put boolean preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to modify

     * @param value

     *            The new value for the preference

     * @return True if the new values were successfully written to persistent

     *         storage.

     */

    public static boolean putBoolean(Context context, String key, boolean value) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = settings.edit();

        editor.putBoolean(key, value);

        return editor.commit();

    }

 

    /**

     * get boolean preferences, default is false

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @return The preference value if it exists, or false. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a boolean

     * @see #getBoolean(Context, String, boolean)

     */

    public static boolean getBoolean(Context context, String key) {

        return getBoolean(context, key, false);

    }

 

    /**

     * get boolean preferences

     * 

     * @param context

     * @param key

     *            The name of the preference to retrieve

     * @param defaultValue

     *            Value to return if this preference does not exist

     * @return The preference value if it exists, or defValue. Throws

     *         ClassCastException if there is a preference with this name that

     *         is not a boolean

     */

    public static boolean getBoolean(Context context, String key,

            boolean defaultValue) {

        SharedPreferences settings = context.getSharedPreferences(

                PREFERENCE_NAME, Context.MODE_PRIVATE);

        return settings.getBoolean(key, defaultValue);

    }

}

参考资料


下载 Demo

时间: 2024-10-21 11:17:15

Android 演示 DownloadManager 下载的相关文章

Android之——多线程下载演示样例

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明白要求将耗时的操作放到一个子线程中运行,文件的下载无疑是须要耗费时间的.所以要将文件的下载放到子线程中运行. 以下,我们一起来实现一个Android中利用多线程下载文件的小样例. 二.服务端准备 在这个小样例中我下面载有道词典为例.在网上下载有道词典的安装包,在eclipse中新建项目web.将下载

Android 使用 DownloadManager 管理系统下载任务的方法

从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作.Download Manager处理HTTP连接并监控连接中的状态变化以及系统重启来确保每一个下载任务顺利完成. 在大多数涉及到下载的情况中使用Download Manager都是不错的选择,特别是当用户切换不同的应用以后下载需要在后台继续进行,以及当下载任务顺利完成非常重要的情况(DownloadManager对于断点续传功能支

DownloadManager 下载管理类

演示 简介 从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到.下载管理类可以长期处理多个HTTP下载任务,客户端只需要给出请求的Uri和存放目标文件的位置即可,下载管理使用了一个AIDL服务器,所以可以放心的在后台执行,同时实例化的方法需要使用getSystemService(Context.DOWNLOAD_SERVICE) ,我们可以轻松的通过新增的这个API实现Android平台上的文件下载操作. Do

android webview downloadManager文件下载管理

一.downloadmanager类说明: 从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到.下载管理类可以长期处理多个HTTP下载任务,客户端只需要给出请求的Uri和存放目标文件的位置即可,下载管理使用了一个AIDL服务器所以可以放心的在后台执行,同时实例化的方法需要使用getSystemService(Context.DOWNLOAD_SERVICE) ,Android123再次提醒使用API Level

Android之——多线程下载示例(一)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载,Android API中明确要求将耗时的操作放到一个子线程中执行,文件的下载无疑是需要耗费时间的,所以要将文件的下载放到子线程中执行.下面,我们一起来实现一个Android中利用多线程下载文件的小例子. 二.服务端准备 在这个小例子中我以下载有道词典为例,在网上下载有道词典的安装包,在eclipse中新建项目web,将下载的

Android之——断点下载示例

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46897641 在上一篇博文<Android之--多线程下载示例>中,我们讲解了如何实现Android的多线程下载功能,通过将整个文件分成多个数据块,开启多个线程,让每个线程分别下载一个相应的数据块来实现多线程下载的功能.多线程下载中,可以将下载这个耗时的操作放在子线程中执行,即不阻塞主线程,又符合Android开发的设计规范. 但是当下载的过程当中突然出现手机卡死,或者网络中断

android 多线程断点续传下载 四 - 仿下载助手

我们先一起简单回顾下它的基本原理. http://blog.csdn.net/shimiso/article/details/6763664  android 多线程断点续传下载 一 http://blog.csdn.net/shimiso/article/details/6763986  android 多线程断点续传下载 二 http://blog.csdn.net/shimiso/article/details/8448544  android 多线程断点续传下载 三 界面效果 线程池 T

Android 演示 Android ListView 和 github XListView(3-3)

本文内容 环境 项目结构 演示 1:简单 XListView 演示 2:XListView + Fragment 演示 3:XListView + ViewPager + Fragment 本文三个演示,循序渐进. 演示 1 是 GitHub 上的 XListView 控件,具备"下拉更新"和"上拉加载"功能,使用它自己的示例: 演示 2 是将 XListView 控件封装到 Fragment 中,个人认为,这种封装在实际项目还是比较常用的: 演示 3 是进一步将

Android Studio的下载和安装教程(从ADT到AS)

之前一直使用的是Android development tools(简称ADT),后来说是google对ADT不再提供支持,然后一直在考虑是否把自己电脑换成Android Studio(简称AS),从ADT到AS这个过程自己觉得软件安装真的伤不起,端午节第二天和第三天(也是今天),终于完成了从ADT到AS的转 变,OK,我还有很多要学习的地方. 下面我来介绍一下ADT的转变成AS: 1.第一次安装完之后模拟器根本启动不了(就算你刚新建的模拟器,他还是不能在启动APP时候没有可用的模拟器),而且用