本文内容

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

本文是 github 上Trinea-Android-common和Trinea-Android-Demo项目的一部分,将下载部分分离出来,看看如何实现。(不知道此人学了多久,Android 水平不低~ 貌似年龄跟我差不多~)

假设,现在有个下载 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 *  */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);    }}

参考资料

  • Trinea-common

下载 Demo

更多相关文章

  1. interllij IDEA 导入 Android(安卓)项目后打开xml没有 Design 选
  2. android 中jar包的导入导出
  3. 如何把多个Android(安卓)Project打包成一个APK
  4. 下载并编译CyanogenMod源代码
  5. Android(安卓)RecyclerView单点、批量数据元素项目item的增加、
  6. Android(安卓)SlidingMenu 开源项目 侧拉菜单的使用(详细配置)
  7. listview 分析
  8. 阿里巴巴 面试经历
  9. C#:Android的未来?

随机推荐

  1. Android(安卓)之采用execSQL和rawQuery方
  2. Android Camera 系统框架分析
  3. [Android进阶]Android消息机制
  4. Android FrameWork学习(二)Android系统源码
  5. Android音频开发(6):使用 OpenSL ES API(上)
  6. Android客户端与PC服务器实现Socket通信(
  7. Android百度地图——搜索服务之周边检索
  8. 浅析Android权限机制(一) —— Android的权
  9. 《Android应用开发揭秘》第九章Android特
  10. Android之Service 生命周期