zoukankan      html  css  js  c++  java
  • Android 演示 DownloadManager——Android 下载 apk 包并安装

    本文内容

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

    本文是 github 上 Trinea-Android-commonTrinea-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

    项目结构


    2015-01-08_120248_副本

    图 1 项目结构

    1

    图 2 主程序

    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);
        }
    }

    参考资料


     

    下载 Demo

  • 相关阅读:
    Linux 环境下umount, 报 device is busy 的问题分析与解决方法
    WScript与CScript的区别
    20170803上课笔记
    20170802上课随笔
    20170801上课笔记
    20170731上课笔记
    20170729上课笔记
    20170727上课笔记
    20170726上课笔记
    20170725上课笔记
  • 原文地址:https://www.cnblogs.com/liuning8023/p/4210507.html
Copyright © 2011-2022 走看看